创建线程有两种方式:
- 继承java.lang.Thread类
- 实现java.lang.Runnable接口
第一种很好懂,测试程序:
在for循环中建立了十个进程,每个进程宏观上讲就是在同时运行的,每个线程中的x都是独立存在互不影响的。
输出结果:
主要是第二种,线程执行的先后顺序的不确定性提现的非常明显:
在for循环之前创建了一个r,所以即便for循环中new了十个t,但每次传参都是传的同一个r对象,所以我理所当然的认为,输出结果肯定为:1,2,3,4,5,6,7,8,9,10
但并不是,实际的输出结果为:
扫描二维码关注公众号,回复:
2351973 查看本文章
数字2直观上讲应该是在前面输出,但却跑到了很后面输出,大概就是x++已经执行了,x已经从1变成了2,但是这个线程似乎就停止在了输出语句前死活不执行,被其他线程抢占了CPU的使用权,等啊等,一直等到好不容易抢回CPU把3的输出的那条线程使用完CPU,用上了CPU把2输出了。
为了更直观的看到线程交替执行,于是又有一个测试程序,专门测试多线程的执行顺序:
该程序共建立的三个线程,运行结果的部分截图为:
很明显,形象点讲,就是三个进程互相争夺CPU资源,争相运行,这样就导致了三个线程的交叉运行,但在某个时刻,只有一个线程运行。当然,宏观上讲,可以说是同时运行。