gpt4 book ai didi

java - 从 InterruptedException 中找出原因

转载 作者:行者123 更新时间:2023-12-01 13:49:13 26 4
gpt4 key购买 nike

如果我的线程在 sleep() 中收到 InterruptedException,我如何判断它是否是由调用其 .interrupt() 或 .notify() 方法引起的?

长话短说:

我有一个在线程中运行的 View() 类。它应该运行工作程序并不时更新 View 。它还应该测量 worker 花费的时间。 View() 应该可以被应用程序中断(关闭时)。当工作人员完成测量所花费的时间时,应该在 sleep 期间唤醒(通知)线程。 (如果没有通知,测量的时间将四舍五入到下一个完整的 sleep 周期,这是不希望的。)因此,可以通过调用线程的 .interrupt() 或 .notify() 方法来触发 InterruptedException。如何在 catch block 中区分它?

public class View() implements Runnable {
Long started = null;
Long finished = null;

@Overload
public void run(){
Set<Thread> workers = new HashSet<Thread>();
for(int i = 1; i <= 5; i++){
Thread worker = new Thread(new Worker());
worker.start();
workers.add(worker);
}

started = System.getCurrentTimeMillis();
do{
try{
TimeUnit.SECONDS.sleep(3);
updateView();
}catch(InterruptedException e){
if(--> thread_was_notified <--){
finished = System.getCurrentTimeMillis();
updateView();
}
if(--> thread_was_notified <--){
for(Thread worker : workers)
worker.interrupt();
}
return;
}
}while(true);
}

protected void updateView(){
// …
}
}

我首先猜测 InterruptedException 会有子类,但是 javadoc 中没有直接已知的子类列表。 。线程提供.isInterrupted() ,但是as said here :“按照惯例,任何通过抛出 InterruptedException 退出的方法都会在这样做时清除中断状态。”所以我也无法从 .isInterrupted() 中看出。干净的方法是什么?

我有一个明确的想法,我的代码应该使用 Object.wait(),但是等待的对象是什么?

最佳答案

丑陋的解决方案:

不要让你的 Workers 中断 View 线程,而是放置一个像这样的方法:

public void workedFinished() {
interruptedByWorker = true; // View attribute.
viewThread.interrupt(); // Interrupt the view
}

然后,当您处于捕获状态时,检查 interruptedByWorker boolean 值。如果属实,那就被 worker 打断了。否则(确保发生这种情况),它会被关闭中断。

另一种解决方案您可以执行以下操作,而不是在两个不同的地方中断线程(我认为这可能会混淆并容易出错):

1) 使用 ScheduledExecutorService 安排一个 Runnable 每 3 秒运行一次来​​更新 View 。2) 有一个 CountdownLatch,每个 Worker 完成时都会收到通知。请注意,在您的代码中,第一个线程唤醒 View ,这意味着测量的时间仅适用于该线程,它不会等到其他线程完成。

关于java - 从 InterruptedException 中找出原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20093210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com