Java 为什么线程在执行代码时会被阻塞;而(Thread.activeCount()>;1)";?
第13章“了解JVM高级特性和最佳实践,第二版”中有以下代码。 但是当线程执行“while(thread.activeCount()>1)”时,它将被阻止,并且不会打印任何内容Java 为什么线程在执行代码时会被阻塞;而(Thread.activeCount()>;1)";?,java,multithreading,Java,Multithreading,第13章“了解JVM高级特性和最佳实践,第二版”中有以下代码。 但是当线程执行“while(thread.activeCount()>1)”时,它将被阻止,并且不会打印任何内容 public class Code_12_1 { public static AtomicInteger race = new AtomicInteger(0); public static void increment(){ race.incrementAndGet(); } private static
public class Code_12_1 {
public static AtomicInteger race = new AtomicInteger(0);
public static void increment(){
race.incrementAndGet();
}
private static final int THREADS_COUNT = 20;
public static void main(String[] args) throws Exception{
Thread[] threads = new Thread[THREADS_COUNT];
for (int i = 0; i < THREADS_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10000; j++) {
increment();
}
}
});
threads[i].start();
}
while (Thread.activeCount() > 1)
Thread.yield();
System.out.println(race);
}
public class code\u 12\u 1{
公共静态AtomicInteger竞赛=新的AtomicInteger(0);
公共静态无效增量(){
race.incrementAndGet();
}
私有静态最终整数线程计数=20;
公共静态void main(字符串[]args)引发异常{
线程[]线程=新线程[线程数];
对于(int i=0;i1)
螺纹屈服强度();
系统输出打印LN(种族);
}
}
但是当我将“while(Thread.activeCount()>1)”更改为“while(Thread.activeCount()>2)”时,线程可以正确执行并输出答案
那么,为什么线程在执行“while(thread.activeCount()>1)”时会被阻塞呢?我已经弄明白了。我运行了您的代码,结果表明,除了主线程之外,最初(在当前线程组中)已经有另一个线程在运行,甚至在您运行所有其他线程之前。因此,下面的print语句给了我一个计数2(参见initialCount): 而且,它将按预期工作 推理:它被阻止,因为所有线程都在启动后完成执行,然后剩下的额外线程永远不会使您退出while循环 如果在
Thread.yield()
之前插入一条print语句,则会得到如下输出:
200000
200000
200000
200000
200000
200000
...
...
这支持这样一种推理,即所有线程都已完成,只剩下2个线程保持循环运行。您没有为线程指定组,因此它是由JVM分配的,而且所使用的组似乎已经在您创建的线程之上有一个正在运行的线程。
activeCount
java文档中的方法:“返回的值只是一个估计值,因为当此方法遍历内部数据结构时,线程数可能会动态变化,并且可能会受到某些系统线程的影响。”。此方法主要用于调试和监视目的。”。因此,这只是一个估计数,可能会受到系统线程的影响。您不应该依赖于activeCount
,而应该使用join
。谢谢,您是对的。但我理解为什么会发生这种情况。如果我使用eclipse运行代码,则代码“在(Thread.activeCount()>1)“没有问题。但是如果我使用Intellij IDEA,它将有问题。因为IDEA将启动一个名为“Monitor Ctrl Break”的新线程,所以活动线程的数量是2。
while (Thread.activeCount() > initialCount){
Thread.yield();
}
200000
200000
200000
200000
200000
200000
...
...