废话不多少,直接上代码:如图
创建三个线程:thread1,thread2,thread3
执行main方法,猜猜结果?
结果是没有顺序的,这是因为启动一个线程,并不是立马去执行,它要等cpu的调度,线程切换是随机的,cpu随机分片,所以没有顺序
那么有什么方法可以解决呢?
它就是join.
看下结果:
有顺序了吧,问题解决了,可是为什么呢?
join的作用:让主线程等待子线程结束后才能运行。
在这里:main 就是主线程,它会等待thread1.执行完毕后才运行。
如图所示,join 让主线程休眠,等子线程结束才运行,这样就保证了顺序
接下来再看看join源码:
不传参数,默认走的是这个wait,点进去看,它是走的object的wait方法,而且是native的。
这样就彻底弄明白join 完成线程控制的原理。
再说另一种方法,在java1.5以后, concurrent 包的流行,ExcutorService的出现也能解决此问题
看代码:
结果也是一样的,那是因为newSingleThreadExecutor,是先进先出的队列形式(FIFO),所以也可以保证执行顺序。
网友评论