【问题标题】:java: Patterns for Monitoring worker threads?java:监控工作线程的模式?
【发布时间】:2011-01-16 03:48:01
【问题描述】:

请原谅我对多线程应用程序缺乏了解,但我是该领域的新手。

是否存在用于从监视器(充当监视器的类)监视工作线程的“作业完成”或“作业状态”的模式或常用方法?

我目前所做的是创建一个工人列表并为每个工人创建一个线程。在所有线程启动后,我将遍历工作列表并通过调用方法来“检查它们的状态”。

当时我无法提出不同的解决方案,但作为该领域的新手,我不知道这是否是要走的路,或者是否还有其他解决方案或模式我应该研究。

【问题讨论】:

标签: java multithreading


【解决方案1】:

根据你的需要,有很多方法可以做到这一点。

如果您只想等到所有线程完成(即您只关心在继续之前完成所有操作),您可以使用Thread.join()

try {
    for (Thread t: threadsIWaitOn)
        t.join();
} catch (InterruptedException iex) {
     /* ... handle error ... 
}

如果您想对线程状态进行更细粒度的控制,并希望能够随时了解线程在做什么,您可以使用Thread.getState() 函数。这将返回一个Thread.State 对象,该对象描述了线程是否正在运行、阻塞、新建等,Javadoc 明确表示它旨在监视线程的状态,而不是尝试对其进行同步。这可能是您想要做的。

如果您想要更多的信息 - 比如,如何为每个线程获取一个进度指示器,随着线程的进展,从 0 计数到 100 - 那么另一个选择可能是从 Thread 创建一个 Map s 到AtomicIntegers 将每个线程与一个计数器相关联,然后将AtomicInteger 传递给每个线程的构造函数。这样,每个线程都可以不断增加计数器,并且您可以有另一个线程不断轮询进度。

简而言之,根据您要完成的任务,您有很多选择。希望这里有帮助!

【讨论】:

  • 非常接近我需要的,如果不是完整的答案。谢谢
【解决方案2】:

使用 ThreadPool 和 Executor,然后你会得到一个 Future,你可以轮询它们的完成情况和一些更好的东西。我可以为你欣赏这本书:Java Concurrency in Practice

【讨论】:

    【解决方案3】:

    尝试使用任何类型的同步。例如,等待某种监视器/信号量,直到工作完成/您需要的任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多