繁体   English   中英

如何编写可投入生产的单一消费者?

[英]How to write production-ready single consumer?

以下是阻塞队列的单个使用者的简单实现。 我的问题是,我还必须添加什么附加代码才能使其投入生产? 假设我需要这个消费者永远待在身边。

几个问题,例如:

  1. while(true)足够好吗?
  2. 当我收到InterruptedException时该怎么办,以便可以尝试恢复正在执行的操作?
  3. 如果线程挂起会怎样?
  4. 如果线程由于异常终止而会发生什么?

我想我的总体问题是围绕实现管理和监视此单线程使用者的一些想法。 或者是否存在提供基本实现的现有库。

非常感谢!

public class Consumer implements Runnable{

    private BlockingQueue queue;

    public Consumer (BlockingQueue queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while(true){
            try {
                Object task = queue.take();
                ...
            } catch (InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

while(true)足够好吗?

哎呀。 @Cratylus指出了您应该始终使用的一个优点:

 while (!Thread.currentThread().isInterrupted()) {

您需要对捕获异常保持虔诚-可能甚至捕获RuntimeException甚至Throwable 至少您应该考虑在退出之前捕获并记录一条消息。

当我收到InterruptedException时该怎么办,以便可以尝试恢复正在执行的操作?

这取决于您希望线程执行的操作。 IMO,当线程被中断时,它应该被(uh)中断。 由于thread.stop()由于许多原因而被弃用,因此thread.interrupt()确实是阻止线程运行的唯一方法。 这意味着它应该清理并退出。

} catch (InterruptedException ex) {
    // always a good practice to re-interrupt
    Thread.currentThread().interrupt();
    // but now what to do?  I vote for stopping the thread
    return;
}

如果线程挂起会怎样?

除非您的程序中有错误,否则这永远不会发生。 它可能会在queue.take()上永远等待,但是中断应该把它queue.take()

注意多个synchronized部分,以防止死锁。 确保使用java.util.concurrent.*类( BlockingQueueExecutors ,...)来减少用户代码引起问题的机会。 使用Atomic*类。 线程之间共享的所有数据都必须正确synchronizedvolatile

如果线程由于异常终止而会发生什么?

你想发生什么? 如果那是您想做的,则应该(再次)认真地捕获异常。 如果您希望线程在看到异常时停止运行,那么我将捕获该异常,将其记录下来,然后清理并返回。 对于异常处理没有简单的答案。

while(true)足够好吗?

不,你应该做while(!interrupted)

当我收到InterruptedException时该怎么办,以便可以尝试恢复正在执行的操作?

如果遇到异常中断,则不应继续。 这是一个停止的信号

如果线程挂起会怎样?

如果您在中断时退出,则不会。 它将以您当前的形式挂起(无法停止,因为您当前已对其进行编码)

如果线程由于异常终止而会发生什么?

它终止。不确定您的意思。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM