Java 线程情况下的异常处理。线程情况下的sleep和wait()方法
我试图编写生产者-消费者模型(java中的生产者线程和消费者线程) 我想知道如何处理由Java 线程情况下的异常处理。线程情况下的sleep和wait()方法,java,multithreading,exception-handling,Java,Multithreading,Exception Handling,我试图编写生产者-消费者模型(java中的生产者线程和消费者线程) 我想知道如何处理由Thread.sleep方法和Object类的wait()方法引发的InterruptedException package producerconsumer; import java.util.ArrayList; public class Consumer implements Runnable { ArrayList<Integer> container; @Overr
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;
}
}
包装产品消费者;
导入java.util.ArrayList;
公共类使用者实现可运行{
ArrayList容器;
@凌驾
公开募捐{
while(true){
System.out.println(“用户线程运行”);
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
if(null==容器){
System.out.println(“容器为空”);
}
//从Arraylist中删除值
已同步(容器){
if(container.size()==0){
试一试{
container.wait();
}捕捉(中断异常e){
//如何处理这个例外
e、 printStackTrace();
}
}
Integer removedInteger=container.remove(container.size()-1);
System.out.println(“removedInteger…”+removedInteger);
}
}
}
公共void集合容器(ArrayList容器){
this.container=容器;
}
}
这是我举的一个例子,在这个例子中,可能不需要考虑这些异常(我的假设)
但我想知道我们需要在哪些不同的情况下处理此异常。
我想知道如何处理Thread.sleep方法和对象类的wait方法引发的中断异常
关于InterruptedException
,有两件重要的事情需要了解。首先,当抛出时,线程上的中断标志被清除。所以你应该经常做一些事情,比如:
} 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()代码>异常。弄清楚你想对它做什么:将它作为另一个异常重新抛出,记录在更好的地方,或者退出线程/方法/应用程序。可能重复@assylias,谢谢你建议了一个好的链接。让我来研究一下。另一个选择是只重新抛出异常(在这种情况下,您不需要重新中断线程)。@Gray感谢您以一种非常棒的方式将其放入。我只是想知道我们是否把它作为另一个例外重新抛出。我的线会停吗?或者循环会像什么都没发生一样继续下去,这是简单的Java语义。绝对没有魔法。对sleep
或wait
的调用引发了异常。执行继续,就像它是来自(比如)InputStream.read的IOException
一样。正如Marko所指出的@SAM,InterruptedException
是一个正常的异常。如果您捕捉到它,那么线程将继续执行。如果将其作为RuntimeException
重新抛出,并且循环未捕获该异常,则线程将从run()
返回,线程将停止。这里适用标准异常规则。我的编译器说wait()
从不抛出InterruptedException
。对吗?我能相信我的编译器吗?;)