并发两个Thread的怪事——已解决

并发两个Thread的怪事——已解决截图是马士兵视频的代码。我这样试了下,的确可行。

但是一般来说,主线程就是用来启动子线程的,所以我用了下图的形式,运行了3次。结果运行结果一直在变化,并且都没有正确的显示内容。这个截图里面编号11的线程没有输出29

并发两个Thread的怪事——已解决

也就是问题出现我第二次是又new了一个线程来执行这段语句而不是在当前进程里执行这段语句。然后我点开Thread.java看其源码。发现通过new Thread(tr)得到的t2与当前线程相比,发现和以下四个因素相关:ThreadGroup,Runnable,Name和stackSize。其中runnable和Name是肯定不一样,stackSize可能都为0,ThreadGroup也可能是同一个SecurityManager的group或者其实就是当前Thread的ThreadGroup。

PS:看了源代码才发现Thread的run方法居然就是直接调target的run方法,而start方法则是把这个线程对象加到ThreadGroup里。

原因找到了:是因为@Test毕竟不能替代main()方法,它是程序执行完就退出。如果在t2.start后面再加一段运行时间肯定能大于t2.start和t1.start运行所需时间的代码块,那么t1和t2的循环就能跑29次。或者干脆使用main方法

上一篇:JSP基础语法---九九乘法表-java jsp


下一篇:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file