Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程情况下的异常处理。线程情况下的sleep和wait()方法_Java_Multithreading_Exception Handling - Fatal编程技术网

Java 线程情况下的异常处理。线程情况下的sleep和wait()方法

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

我试图编写生产者-消费者模型(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;
    }
}
包装产品消费者;
导入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
。对吗?我能相信我的编译器吗?;)