提问人:user22844207 提问时间:11/10/2023 最后编辑:user22844207 更新时间:11/12/2023 访问量:46
在 Thread Java 中的 interrupt() 之后调用 join()
call join() after interrupt() in Thread Java
问:
我正在学习 Thread Java,我按照官方文档 java 上的教程进行操作
此示例结合了各种方法:、 和 、join()
sleep()
interrupt()
start()
public class SimpleThread {
// Display a message, preceded by
// the name of the current thread
static void threadMessage(String message) {
String threadName = Thread.currentThread().getName();
System.out.format("%s: %s%n", threadName, message);
}
private static class MessageLoop implements Runnable {
public void run() {
String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
try {
for (int i = 0;
i < importantInfo.length;
i++) {
// Pause for 4 seconds
Thread.sleep(4000);
// Print a message
threadMessage(importantInfo[i]);
}
} catch (InterruptedException e) {
threadMessage("I wasn't done!");
}
}
}
public static void main(String[] args) throws InterruptedException {
// Delay, in milliseconds before
// we interrupt MessageLoop
// thread (default 10s).
long patience = 1000 * 10;
threadMessage("Starting MessageLoop thread");
long startTime = System.currentTimeMillis();
Thread t = new Thread(new MessageLoop(), "MessageLoop");
t.start();
threadMessage("Waiting for MessageLoop thread to finish");
while (t.isAlive()) {
threadMessage("Still waiting...");
t.join(16000);
if (((System.currentTimeMillis() - startTime) > patience) && t.isAlive()) {
threadMessage("Tired of waiting!");
t.interrupt();
t.join();
}
}
threadMessage("Finally!");
}
}
为什么作者使用后?join()
interrupt()
这样做的目的是什么?因为我试图评论它,所以没有任何变化。
答:
3赞
matt
11/10/2023
#1
在线程上调用 interrupt 会发出终止线程的信号,但不会强制终止。因此,线程可能仍在运行。调用 join 将强制调用线程等待,直到中断的线程完成,或者自身被中断。
在线程中,大部分等待是由 Thread.sleep() 引起的。调用 interrupt 时,当前或下一次休眠调用将以中断异常结束。这意味着被中断的工作线程将很快结束。在这种情况下,调用 join 可能不是必需的,因为线程终止得太快了。
评论
0赞
user22844207
11/10/2023
多谢。你解释得很清楚
评论