【问题标题】:Check if ALL the waiting threads are in waiting state and not working检查所有等待线程是否处于等待状态并且不工作
【发布时间】:2016-04-22 09:44:31
【问题描述】:

我有一个 ProcessesManagerextends Thread。在run() 方法中,我正在这样做:

public void run() {
    while(true)
    synchronized (GlobalVariables.queue) {
        while (GlobalVariables.queue.isEmpty())
            // Threads are waiting here...
            GlobalVariables.queue.wait();

        // Get the next work item off of the queue
        work = GlobalVariables.queue.remove();
    }
}

在 main 方法中,我创建了 ProcessesManager 类的四个实例(线程)。

for (int i = 0; i < 4; i++) {
        ProcessesManager processesManager = new ProcessesManager();
        processesManager.start();
}

他们正在等待queue。队列一开始是空的,然后我开始填满队列,线程开始处理队列项。现在线程同时从队列中删除/添加项目。程序本身没有“结束”。但要明确一点,程序的结束是在 1. Queue 为空的时候。 2. 所有线程都在等待,不再工作。

现在我想实现一个检查三个条件的方法:

  1. 检查队列是否为空。

  2. 检查是否所有线程都在等待并且没有线程在做任何工作。

  3. 检查它是否不是应用程序的开始(因为在开始时,上述两个条件会暂时成立)。

如果满足以上所有条件,我想退出/关闭应用程序。

我可以通过简单地检查GlobalVariables.queue.isEmpty() 方法来检查条件1。但我不知道如何检查所有线程是否都处于等待状态。我也可以找到第三种情况的解决方案。

如何检查是否所有线程都在等待而不工作?

编辑

我正在使用本教程:http://www.drdobbs.com/parallel/java-concurrency-queue-processing-part-1/232700457。有没有办法知道程序的结束?

【问题讨论】:

    标签: java multithreading queue


    【解决方案1】:

    使用带有条件的 ReentrantLock ,它有很多方法可以解决你的问题 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html

    【讨论】:

      【解决方案2】:

      需要明确的是,程序的结束是在 1. 队列为空的时候。 2. 所有线程都在等待,不再工作。

      假设您的工作线程平均比填充队列的生产者快。在这种情况下,队列大部分时间都是空的,并且工作人员将在大部分时间等待。在你的方案中,如果队列是空的,并且worker都处于空闲状态,那么无法判断这是因为生产者真的完成了,还是只是因为生产者在添加下一个项目时有点慢。

      也许在您的应用程序中,生产者永远不会落后,但您的代码中没有任何东西可以保证它永远不会落后。

      您正在实现的东西称为线程池(例如,像java.util.concurrent.ThreadPoolExecutor)。在大多数线程池实现中,生产者可以通过某种方式显式关闭线程池(例如,ThreadPoolExecutor.shutdown()

      实现关闭的一种方法是使用毒丸——一个特殊的任务,它告诉拉它的工作线程终止。当需要关闭池时,调用者只需在队列中加载至少与服务队列的工作线程一样多的毒丸。

      【讨论】:

      • 是的,我对 ThreadPool 进行了一些研究。但决定不实施。问题是:我的生产者和消费者是同一个线程。例如如果我启动四个线程,这些相同的线程将消费和生产并查看同一个队列。 “生产者”线程可以将一些工作“放入”队列中,但也可以从队列中“获取”一些工作并“使用”它。无论如何,我解决了它。但我想知道是否可以在不终止线程的情况下关闭我的程序。这是一个“好的”做法吗?
      猜你喜欢
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多