【问题标题】:How to resume my thread that is in a blocking process due to linkedBlockingQueue.take()如何恢复由于linkedBlockingQueue.take()而处于阻塞进程中的线程
【发布时间】:2014-12-02 10:51:11
【问题描述】:

我有一个生产者线程,它将继续将值插入到linkedBlockingQueue 中,并且有多个消费者线程将同时从这个linkedBlockingQueue 中获取()。我让他们继续思考的条件是,当我的生产者标志完成时为假,当它为真时,他们将停止尝试。但是我遇到了我的第二个线程在 take() 块进程中的问题。我相信这是因为在我的制作人在结束时将标志设置为 true 之前,其中一个胎面已经在执行 take() 阻塞方法的 run() 主体内。由于不会有任何新元素添加到linkedBlockingQueue,它将处于永远阻塞的进程中。我该如何解决这个问题?

【问题讨论】:

    标签: java multithreading blockingqueue


    【解决方案1】:

    解决这个问题的一个标准方法是让生产者线程在完成后在共享队列中插入一些有害值(您选择的一些特殊值)。你应该把毒值的数量等于 numOfThreads。

    在消费者线程中,每当您获取一个值时,您都会检查该值是否是毒值。如果是,您可以返回。

    【讨论】:

    • 你介意帮我想一些可能是文件名的毒值吗?我怎样才能摆脱 run() 方法?
    • 谢谢我做了一个永远的while循环然后打破它。但是我的毒值是“endOfWorkQueue”,不要认为它是 fileName 的唯一 enuff 值......仍然有可能 ppl 将其作为文件名输入
    • 退出运行只需调用return。对于文件名,请检查:stackoverflow.com/questions/1976007/…。在 Windows 中,文件名不能包含:\/:?*|
    【解决方案2】:

    你可以中断正在等待take()的线程,所以take()会抛出InterruptedException,被捕获,所以执行会进入catch子句。

    【讨论】:

    • 如何中断正在阻塞进程的线程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2021-10-29
    相关资源
    最近更新 更多