2016-07-25 7 views
0

У меня есть 2 Тема: main и Thread2.Проснитесь от readLine() (от System.in, No socket)

Главное -> создать Thread2, спать на 3 секунды, выйти.

Thread2 -> readline from System.in и выход.

Я хочу проснуться Thread2, если он является блоком в readline(), я не хочу использовать таймаут и закрытие основного входного потока путем генерации исключения в Thread2 не работает.

Код:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.InterruptedIOException; 

public class Main {  
    public static void main(String[] args) throws InterruptedException { 
    InputStreamReader sc = new InputStreamReader(System.in); 

    Thread2 t = new Thread2(sc); 
    Thread tt = new Thread(t); 
    tt.start(); 

    Thread.sleep(3000); 
    System.out.println("exit sleep"); 

    tt.interrupt(); 
    System.out.println("exit main"); 
    } 
} 

class Thread2 implements Runnable { 
    InputStreamReader qst; 

    public Thread2(InputStreamReader sc) { 
    qst = sc; 
    } 
    public void run() { 
    BufferedReader buff = new BufferedReader(qst); 
    try { 
     System.out.println("read thread"); 

     buff.readLine(); //Here is locked!!!!!!!!!!!!!!!!!! 
    } catch (InterruptedIOException e) { 
     System.out.println("exit thread"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

Исполнение (Println):

-Чтение резьбы

(после 3 секунды)

-exit сна

-exit main

Но Thread2 non stop -> это блок в readline. Зачем?

ответ

0

Вы можете установить нить Deamon:

tt.setDaemon(true); 

Док говорит:

маркирует эту нить или как демон нить или нити пользователя. Виртуальная машина Java выходит, когда единственными потоками, запущенными, являются все потоки демона.

В вашем случае tt перестанет работать, когда закончится основная нить.

+0

спасибо, что эта работа! – John

0

Есть два варианта здесь:

  1. Как и другие предложили, вы как-то надо принудительно закрыть ваш входной поток
  2. Вы можете сделать шаг назад и рассмотреть возможность перепроектировать всю свою вещь: Java предлагает вам методики неблокирующие IO. Вы можете обратиться к here за некоторыми указаниями, как это сделать.

Конечно, это действительно зависит от вашего контекста, какой из двух имеет больше смысла. Вариант 2, конечно, означает очень иной подход; но с другой стороны: если вы не хотите блокировать чтение, тогда хорошо: вы не должны блокировать чтение.

+0

спасибо за 2 пункта ответов, 1 пункт не работает, может быть, потому что inputstrem не блокирует, не так ли? – John

+0

@John Для 'System.in' нет неблокирующего ввода-вывода. – EJP

 Смежные вопросы

  • Нет связанных вопросов^_^