java:监视工作线程的模式?

时间:2011-01-15 17:52:25

标签: java multithreading

并原谅多线程应用程序缺乏知识,但我是该领域的新手。

是否有一种模式或常用的方法用于监视来自监视器(充当监视器的类)的工作线程的“作业完成”或“作业状态”?

我目前所做的是创建一个工作列表并为每个工作者创建一个线程。在所有线程开始之后,我循环遍历工作者列表并通过调用方法来“检查其状态”。

当时我无法想出一个不同的解决方案,但对于该领域的新手,我不知道这是否可行,或者是否还有其他解决方案或模式我应该学习。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

如果您只是想等到所有线程完成(即您所关心的所有内容都已完成所有内容),您可以使用Thread.join()

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

如果您想要对线程状态进行更细粒度的控制,并希望能够随时了解正在执行的线程,则可以使用Thread.getState()函数。这将返回一个Thread.State对象,该对象描述线程是否正在运行,阻塞,是否等等,而Javadoc特别指出它是为监视线程状态而不是尝试在其上进行同步而设计的。这可能是你想要的。

如果您想了解更多信息 - 例如,如何在线程进展时为每个从0到100计数的线程获取进度指示器 - 那么另一个选项可能是从{创建Map {1}} Thread将每个线程与一个计数器相关联,然后将AtomicInteger传递给每个线程的构造函数。这样,每个线程可以连续递增计数器,并且您可以使用另一个连续轮询进度的线程。

简而言之,根据您正在尝试完成的内容,您有很多选择。希望这里的东西有所帮助!

答案 2 :(得分:1)

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

相关问题