我编写了以下方法来并行运行多个线程,当所有线程完成时,我想触发一些进一步的操作。我已将 propertyChangeListener 附加到在其自己的线程中运行的每个对象,并且每个对象在其线程完成时都会触发属性更改事件。因此,对于每个事件,我都会增加计数并将其与对象列表的大小进行比较。一旦它们相等,我就知道所有线程都已完成。然而,这似乎有点困惑,而且我对多线程还很陌生,所以我想我应该问问其他人对我的方法的看法,以及是否有更优雅或更强大的方法。谢谢。
private void jButtonRunSubsetsActionPerformed(java.awt.event.ActionEvent evt) {
count = 0;
List<SpeciesSelection> specSelList = new ArrayList<>();
for (String str : fileList) {
// TODO RUN THE FILES
if (!str.equals("")) {
String[] args = {str};
//run solution
SpeciesSelection specSel = new SpeciesSelection(args, true);
specSelList.add(specSel);// add the thread to the list so we can check for all threads to be finished.
// Create listener to listen for specSel finished
specSel.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
// TODO do something
count++;
if (count == specSelList.size())
{
System.out.println("Finished all threads");
}
}
});
Thread t = new Thread(specSel);
t.start();
}
}
}
最佳答案
不要使用 int
计数器并检查其值,而是使用设计的 CountDownLatch
。
CountDownLatch count = new CountDownLatch(nbRequiredCount);
count.await();
当计数器未达到 0
时,await()
不会返回。
并在线程中递减它:
public void propertyChange(PropertyChangeEvent evt) {
// TODO do something
count.countDown();
}
关于java - 检测多个线程何时完成的正确方法 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49029026/