Я работаю над MUD в Java. Я считал вход для плеера каждая галочка, но я использую Scanner
который использует операции блокирования. Я хочу иметь вход неблокирования.
Я посмотрел на nio
пакет, который имеет a Selector
класс, но я не уверен, как использовать его относительно System.in
. Я полагаю, что мне определенно будет нужен он, после того как я выполняю сервер, но на данный момент все в режиме офлайн.
Я попытался расширить основной класс от Applet
и переопределение keyDown
, но это просто означало, что вход больше не принимался после первого. Несомненно, я ничего не блокировал больше, но затем там больше не был введен. keyDown
никогда не назывался снова, я предполагаю.
Возможно, потоки могут быть прерваны, даже когда они выполняют операции блокирования?
Спасибо за любое понимание этой проблемы.
JLine также может соответствовать вашим требованиям:
http://jline.sourceforge.net/apidocs/src-html/jline/ConsoleReader.html # line.1447
keyDown () не рекомендуется , поэтому я бы предложил использовать processKeyEvent и keyListener вместо этого.
Возможно, потоки могут быть прерваны, даже если они выполняют блокирующие операции?
Да, если у вас есть ссылка на объект потока, который вы хотите прервать, вы можете просто вызвать метод interrupt () для этого пример. А в методе выполнения потока вы можете обработать прерванное исключение. Однако это кажется немного взломанным. Я не понимаю, чем это может быть полезнее простого KeyListener.
Вы не можете сделать это с системной консолью, потому что в настоящее время это не может быть выполнено в многоплатформенном режиме.
Вы можете использовать поворотное окно в качестве консоли или найти подход на основе JNI, но он может не работать на некоторых платформах.
Вы можете использовать JCurses . Может работать, он основан на JNI и поддерживает Windows и Linux.
Мне пришлось решить аналогичную проблему с блокировкой записи / чтения с http. В этом конкретном случае я использовал локальный буфер и потоки.
Идея проста: один поток читает из стандартного ввода и помещает содержимое в буфер. Во-вторых, сделайте то же самое с письмом.
И затем вы используете неблокирующие запросы в свой буфер.
Пример кода:
class NonBlockingReader implements Runnable{
Reader in;
List buffer;
public void run(){
String line=null;
while((line=in.readLine())!=null){
storeLine(line);
}
}
private synchronized storeLine(String line){
buffer.add(line);
}
public synchronized String getLine(){
if(list.size()>0)
return list.removeFirst();
return null;
}
}
// .. same for writer, then you jast pass stdin and stdout ...