【问题标题】:Exception Handling in case of Thread.sleep and wait() method in case of ThreadsThread.sleep 的异常处理和 Threads 的 wait() 方法
【发布时间】:2012-04-25 13:45:56
【问题描述】:

我正在尝试编写一个生产者消费者模型(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 multithreading exception-handling


【解决方案1】:

我想知道如何处理Thread.sleep方法和Object Class的wait方法抛出的中断异常

关于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(); 例外。弄清楚你想用它做什么:作为另一个异常重新抛出它,将它记录在更好的地方,或者退出线程/方法/应用程序。

【讨论】:

  • 另一种选择是重新抛出异常(在这种情况下您不需要重新中断线程)。
  • @Gray 感谢您以一种很棒的方式展示它。只是想知道我们是否将其作为另一个例外重新抛出。我的线程会停止吗?或者循环会像什么都没发生一样继续进行吗?
  • 这是简单的 Java 语义。绝对没有魔法。您对sleepwait 的调用引发了异常。执行继续,就好像它是来自InputStream.readIOException
  • Marko 指出@SAM,InterruptedException 是一个普通的Exception。如果你抓住它,那么你的线程的执行将继续。如果您将它作为RuntimeException 重新抛出并且循环没有捕获该异常,则线程将从run() 返回并且线程将停止。此处适用标准例外规则。
  • 我的编译器说 wait() 从不抛出 InterruptedException。那是对的吗?我可以信任我的编译器吗? ;))
猜你喜欢
  • 2011-03-21
  • 2015-01-05
  • 2012-02-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2014-04-02
  • 2015-05-21
  • 2018-08-19
相关资源
最近更新 更多