Консольный ввод с клавиатуры Concurrent/Non-blocking

Я работаю над MUD в Java. Я считал вход для плеера каждая галочка, но я использую Scanner который использует операции блокирования. Я хочу иметь вход неблокирования.

Я посмотрел на nio пакет, который имеет a Selector класс, но я не уверен, как использовать его относительно System.in. Я полагаю, что мне определенно будет нужен он, после того как я выполняю сервер, но на данный момент все в режиме офлайн.

Я попытался расширить основной класс от Applet и переопределение keyDown, но это просто означало, что вход больше не принимался после первого. Несомненно, я ничего не блокировал больше, но затем там больше не был введен. keyDown никогда не назывался снова, я предполагаю.

Возможно, потоки могут быть прерваны, даже когда они выполняют операции блокирования?

Спасибо за любое понимание этой проблемы.

7
задан TT. 23 January 2016 в 09:08
поделиться

4 ответа

JLine также может соответствовать вашим требованиям:

http://jline.sourceforge.net/apidocs/src-html/jline/ConsoleReader.html # line.1447

-1
ответ дан 8 December 2019 в 01:44
поделиться

keyDown () не рекомендуется , поэтому я бы предложил использовать processKeyEvent и keyListener вместо этого.

Возможно, потоки могут быть прерваны, даже если они выполняют блокирующие операции?

Да, если у вас есть ссылка на объект потока, который вы хотите прервать, вы можете просто вызвать метод interrupt () для этого пример. А в методе выполнения потока вы можете обработать прерванное исключение. Однако это кажется немного взломанным. Я не понимаю, чем это может быть полезнее простого KeyListener.

0
ответ дан 8 December 2019 в 01:44
поделиться

Вы не можете сделать это с системной консолью, потому что в настоящее время это не может быть выполнено в многоплатформенном режиме.

Вы можете использовать поворотное окно в качестве консоли или найти подход на основе JNI, но он может не работать на некоторых платформах.

Вы можете использовать JCurses . Может работать, он основан на JNI и поддерживает Windows и Linux.

2
ответ дан 8 December 2019 в 01:44
поделиться

Мне пришлось решить аналогичную проблему с блокировкой записи / чтения с 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 ...
-1
ответ дан 8 December 2019 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: