gpt4 book ai didi

java - Thread.sleep 情况下的异常处理和 Threads 情况下的 wait() 方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:56:31 25 4
gpt4 key购买 nike

我正在尝试编写一个生产者消费者模型(java 中的生产者线程和消费者线程)

我想知道如何处理 Thread.sleep 方法和 Object 类的 wait() 抛出的 InterruptedException 方法

package producerconsumer;

import java.util.ArrayList;

public class Consumer implements Runnable {

ArrayList<Integer> container;

@Override
public void run() {
while(true){
System.out.println("Consumer Thread Running");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(null==container){
System.out.println("container is null");
}
//Removing values from Arraylist
synchronized (container) {
if(container.size()==0){
try {
container.wait();
} catch (InterruptedException e) {
//How to tackle this exception
e.printStackTrace();
}
}
Integer removedInteger = container.remove(container.size()-1);
System.out.println("removedInteger..."+removedInteger);
}
}
}

public void setContainer(ArrayList<Integer> container) {
this.container = container;
}
}

这是我举的一个例子,在这个例子中可能不需要处理这些异常(我的假设)。

但我想知道我们需要处理此异常的可能情况有哪些。

最佳答案

I was wondering how to handle the interrupted Exception that is thrown by Thread.sleep method and the Object Class's wait method

InterruptedException 有两件重要的事情需要了解。首先,当它被抛出时,Thread 上的中断标志被清除。所以你应该总是做这样的事情:

} catch (InterruptedException e) {
// re-add back in the interrupt bit
Thread.currentThread().interrupt();
...
}

这是一个非常重要的模式,因为它允许其他可能调用您的代码的代码也检测中断。

其次,对于线程而言,如果它们被中断,它们很可能会清理并退出。这当然取决于你,程序员,但一般的行为是终止并退出正在执行的操作——通常是因为程序试图关闭。

} catch (InterruptedException e) {
Thread.currentThread().interrupt();
// we are being interrupted so we should stop running
return;
}

最后,对于任何异常处理,默认的 Eclipse 模板通常都是错误的做法。绝不只是 e.printStackTrace(); 异常。弄清楚你想用它做什么:将它作为另一个异常重新抛出,将它记录在更好的地方,或者退出线程/方法/应用程序。

关于java - Thread.sleep 情况下的异常处理和 Threads 情况下的 wait() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10317041/

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