Thread
类的activeCount()
方法用于返回当前线程的线程组中活动线程的数量。返回的值只是一个估计值,因为当此方法遍历内部数据结构时,线程数可能会动态更改。
public class TestMain {
static public class MyAtomicInteger{
AtomicInteger integer =new AtomicInteger();
public void plusOne(){
integer.getAndIncrement();
}
}
public static void main(String[] args) {
MyAtomicInteger myAtomicInteger=new MyAtomicInteger();
for (int i = 0; i < 20; i++) {
new Thread(()->{
for (int j = 0; j < 1000; j++) {
myAtomicInteger.plusOne();
// System.out.println("1.0 : "+myAtomicInteger.integer.get());
}
}).start();
}
if(Thread.activeCount()>=2){
System.out.println("2.0:"+Thread.activeCount());
Thread.yield();
System.out.println("3.0:"+Thread.activeCount());
}
/*while (Thread.activeCount() > 2) {
System.out.println("其他活跃的线程数" + Thread.activeCount());
Thread.yield();
}*/
System.out.println(myAtomicInteger.integer.get());
}
}
执行结果:不等于20000,只执行一次if判断可能子线程没有执行完主线程就已经结束了,最后结果不一致,只要最后输出之前加
Thread.sleep(10000);一样能输出20000
public class TestMain {
static public class MyAtomicInteger{
AtomicInteger integer =new AtomicInteger();
public void plusOne(){
integer.getAndIncrement();
}
}
public static void main(String[] args) {
MyAtomicInteger myAtomicInteger=new MyAtomicInteger();
for (int i = 0; i < 20; i++) {
new Thread(()->{
for (int j = 0; j < 1000; j++) {
myAtomicInteger.plusOne();
System.out.println("1.0 : "+myAtomicInteger.integer.get());
}
}).start();
}
if(Thread.activeCount()>=2){
System.out.println("2.0:"+Thread.activeCount());
Thread.yield();
System.out.println("3.0:"+Thread.activeCount());
}
/* while (Thread.activeCount() > 2) {
System.out.println("其他活跃的线程数" + Thread.activeCount());
Thread.yield();
}*/
System.out.println(myAtomicInteger.integer.get());
}
}
执行结果:
System.out.println("1.0 : "+myAtomicInteger.integer.get());这句话加上以后输出结果就变成了20000了,我把System.out.println去掉,返回结果又变成一个不确定的数字了,由此可见System.out.println会阻塞主线程的运行,可参考https://blog.csdn.net/weixin_34232617/article/details/85957619
public class TestMain {
static public class MyAtomicInteger{
AtomicInteger integer =new AtomicInteger();
public void plusOne(){
integer.getAndIncrement();
}
}
public static void main(String[] args) {
MyAtomicInteger myAtomicInteger=new MyAtomicInteger();
for (int i = 0; i < 20; i++) {
new Thread(()->{
for (int j = 0; j < 1000; j++) {
myAtomicInteger.plusOne();
// System.out.println("1.0 : "+myAtomicInteger.integer.get());
}
}).start();
}
/*if(Thread.activeCount()>=2){
System.out.println("2.0:"+Thread.activeCount());
Thread.yield();
System.out.println("3.0:"+Thread.activeCount());
}*/
while (Thread.activeCount() > 2) {
System.out.println("其他活跃的线程数" + Thread.activeCount());
Thread.yield();
}
System.out.println(myAtomicInteger.integer.get());
}
}
执行结果:
加上while (Thread.activeCount() > 2)后,主线程就会一直在此循环里,知道子线程执行完并且Thread.activeCount() 小于2了,就会执行完,结果就是我们预期的20000