如何在Java中计算线程类中运行的线程数?

如何在Java中计算线程类中运行的线程数?,java,multithreading,Java,Multithreading,我已经用Java实现了这个线程类 它的实例在同一个表上的mysql数据库中做一些业务。 当所有线程都完成后,我想调用另一个方法来读取表。 这意味着,最后一个运行的线程实例必须调用“read方法”。因此,每个线程都需要知道,当它完成时,有多少“兄弟姐妹”仍在运行 这就引出了我的问题: 是否有适当的解决方案或线程方法来计算来自同一父类的所有正在运行的线程实例 我希望我没有忽略一个简单的解决方案。在您的线程类中,创建以下变量: private static int counterAlive = 0;

我已经用Java实现了这个线程类

它的实例在同一个表上的mysql数据库中做一些业务。 当所有线程都完成后,我想调用另一个方法来读取表。 这意味着,最后一个运行的线程实例必须调用“read方法”。因此,每个线程都需要知道,当它完成时,有多少“兄弟姐妹”仍在运行

这就引出了我的问题: 是否有适当的解决方案或线程方法来计算来自同一父类的所有正在运行的线程实例


我希望我没有忽略一个简单的解决方案。

在您的
线程
类中,创建以下变量:

private static int counterAlive = 0;
每次你创建一个新的一个计数它,当它下来解开它

还应添加以下内容:

public static int getAliveThreads(){
    return this.counterAlive;
}

public void run(){
   counterAlive++;
.
.
.
.

   counterAlive--;
}

与“计算”辅助线程不同,您应该对创建的每个线程执行
join()
,这将导致主线程等待它们全部完成。你能发布你当前的代码,让我们看看线程是如何启动的吗?只需依次调用所有线程上的
join
方法。信号量和倒计时锁存器也是你的朋友。但是如果我是你的话,我真的会在跳入同步这个多刺的世界之前仔细阅读多线程。它可以为您节省很多痛苦。您还需要确保每个线程在被抢占之前都释放了与数据库相关的锁,这样所有其他线程就不会饿死。谢谢朋友们!我知道我听说过这样的事:加入…:D@CraigOtis还没有线程代码,但我想知道它,现在我有了解决方案!谢谢。对不起,那是个糟糕的主意。你试过了吗?@NewOutlaw为什么不?因为如果没有同步,所有线程都可以看到不同的计数器值,事实上,计数器甚至可能根本无法从另一个线程的角度进行更新。这就是创建
CountDownLatch
类的目的。他可以使用原子整数计数器,这可能会起作用。@DavidWallace如果它位于线程末尾,
join()
确实是最简单的解决方案。但在现实世界中,您根本不应该创建线程,最好使用执行器,在这种情况下,
join()
不起作用:在这种情况下,锁存和信号量是惯用的解决方案。每次编辑都会使情况越来越糟。现在,一个简单的未捕获异常可以保证计数器永远不会达到零。这根本不是解决问题的办法。正如@TimBiegeleisen所说,有了一个原子整数和大量的注意,你就可以让这项工作顺利进行,但有更好、更安全的解决方案。