培训第33天,关于多线程的执行顺序
我们老师目前讲的创建线程的方式有两种,其实还有其他方法,如线程池,但此文关注点为多线程的执行顺序,所以只用实现java.lang.Runnable接口的方式创建线程来分析:
实现Runnable接口,并在主方法中实现MyRunnable实例:
在for循环之前创建了一个r,所以即便for循环中new了十个t,创建了十个线程,但每次传参都是传的同一个r对象,我一开始的想法是,for循环再快也有先后顺序,输出结果肯定为:1,2,3,4,5,6,7,8,9,10
但并不是,实际的输出结果为:
数字2直观上讲应该是在前面输出,但却跑到了很后面输出,揣测下运行过程:
第二次x++已经执行了,x已经从1变成了2,但是这个线程似乎就停止在了输出语句前止步不前,是因为被其他线程抢占了CPU的使用权,直到后面才争取到了CPU把输出语句执行。
为了更直观的看到线程交替执行,于是又写一个测试程序,这次创建了三个线程,专门测试多线程的执行顺序:
运行结果的部分截图为:
很明显,三个进程是交替运行的。
总结:多线程的执行,宏观上是同时进行的,但实质上是各个线程互相争夺CPU资源,争相运行,某个时刻,只有一个线程在运行。