培训第33天,关于多线程的执行顺序。

创建线程有两种方式:

  1. 继承java.lang.Thread类
  2. 实现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资源,争相运行,这样就导致了三个线程的交叉运行,但在某个时刻,只有一个线程运行。当然,宏观上讲,可以说是同时运行。

猜你喜欢

转载自blog.csdn.net/Chandelier_20180711/article/details/81167530