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

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

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

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

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

根据您的需要,您可以通过多种方式执行此操作。

如果你只想等到所有线程都完成(即你所关心的只是在继续之前完成所有事情),你可以使用Thread.join()

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

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

如果你想要更多的信息 – 比如,如何获得每个线程的进度指示器,随着线程的进展从0到100计数 – 那么另一个选项可能是创建一个MapThread s到AtomicInteger关联每个线程使用计数器,然后将AtomicInteger传递给每个线程的构造函数。 这样,每个线程可以连续递增计数器,并且您可以拥有另一个连续轮询进度的线程。

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

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

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