为了得到多线程操作下的最终结果,我们可能会在主线程写这样的代码:
while(Thread.activeCount()>1){
Thread.yield();
}
System.out.println(结果);
如研究多线程下i++的线程不安全问题时:
public class Test {
public volatile int inc = 0;
public synchronized void increase() {
inc++;
}
public static void main(String[] args) {
final Test test = new Test();
for(int i=0;i<10;i++){
new Thread(){
public void run() {
for(int j=0;j<1000;j++)
test.increase();
};
}.start();
}
while(Thread.activeCount()>1) //保证前面的线程都执行完
Thread.yield();
System.out.println(test.inc);
}
}
《深入理解java虚拟机》第二版代码清单12-1的源代码(有修改)
但是当使用idea的时候,往往得不到我们想要的结果,在在使用java命令行执行或者eclipse执行却没有这个问题。
经过测试发现,原来在执行main方法时,idea会启动两条线程,测试如下:
public class Main {
public static void main(String[] args) {
System.out.println(Thread.activeCount());
}
}
输出:
把线程列出来看看:
public class Main {
public static void main(String[] args) {
Thread.currentThread().getThreadGroup().list();
}
}
输出:
可以发现:
除了main方法的主线程外还有,还多了一个预期外的 Monitor Ctrl-Break 线程,具体这个线程是干嘛的请读者自行百度啦,因为我也不知道。
所以在判断线程执行完的条件改为活跃线程数 >2 yield()就行了