[英]wake up thread from readLine() (from System.in , No socket )
我有2個線程: main和Thread2 。
首頁 - >創建線程2,睡眠3秒,退出。
Thread2- >從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秒后)
退出睡眠
出口主
但是Thread2不間斷->它在讀取行中被阻塞。 為什么?
您可以將線程設置為守護進程:
tt.setDaemon(true);
醫生說:
將此線程標記為守護程序線程或用戶線程。 當僅運行的所有線程都是守護程序線程時,Java虛擬機將退出。
在您的情況下,tt將在主線程結束時停止運行。
這里有兩個選項:
當然,這實際上取決於您的上下文,兩者中哪一個更有意義。 選項2當然意味着截然不同的方法。 但另一方面:如果您不想阻止讀取,那就好了:您不應阻止讀取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.