我有2个主题:主要和主题2 。
主要 - >创建Thread2,休眠3秒,退出。
线程2 - >从System.in读取并退出。
我想唤醒Thread2,如果它在readline中阻塞(),我不想使用超时,并通过在Thread2中生成异常来关闭主输入流&# 39;工作。
代码:
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):
-read Thread
(3秒后)
- 退出睡眠
-exit main
但是Thread2不停 - >它在readline中是块。为什么呢?
答案 0 :(得分:0)
您可以将线程设置为deamon:
tt.setDaemon(true);
医生说:
将此线程标记为守护程序线程或用户线程。当运行的唯一线程都是守护程序线程时,Java虚拟机将退出。
在你的情况下,当主线程结束时,tt将停止运行。
答案 1 :(得分:0)
这里有两个选项:
当然,这实际上取决于你的背景,这两者更有意义。选项2当然意味着一种非常不同的方法;但另一方面:如果你不想阻止读取,那么:你不应该阻止读取。