控制多线程执行顺序
- 2019 年 10 月 5 日
- 笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37933685/article/details/83619945
个人博客:https://suveng.github.io/blog/
控制多线程的执行顺序
示例代码的码云地址:https://gitee.com/suwenguang/test/blob/master/fuxi/src/main/java/多线程/控制多线程的顺序执行/App.java
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
我们在运行多线程的程序时,假设线程逐一启动的,但是发现线程的执行并不是逐一执行的。这是因为CPU随机调度的问题,谁分配到CPU谁就执行,如果好奇进程调度算法可以自行Google。
大概的思路可以这样子理一下:
程序启动->CPU分配内存给Java进程->Java进程的程序建立线程->进程分配线程空间->线程随机获取CPU执行->线程结束->主线程结束,进程销毁
这里关键是线程是随机获取CPU执行的
想要控制线程的执行顺序应该怎么做?
- 使用join()方法
- 使用SingleThreadExecutor线程池
使用join()方法
public void joinTest() throws InterruptedException { // 通过join() 方法保证线程的顺序,但是这样子就和单线程没什么区别了。 // join()是让主线程等待子线程结束后 继续运行 thread1.start(); thread1.join(); thread2.start(); thread2.join(); thread3.start(); thread3.join(); }
join()是让主线程等待子线程结束后,继续运行。
使用SingleThreadExecutor线程池
/** * 通过singleThreadPool来控制线程顺序,singleThreadPool是FIFO先进先出的一个线程池 */ @Test public void executorTest(){ executorService.submit(thread1); executorService.submit(new Runnable() { @Override public void run() { System.out.println("i am second"); } }); executorService.submit(() -> System.out.println("i am third")); executorService.submit(thread2); executorService.submit(thread3); }
其作用类似于线程队列,提交任务到队列,线程池负责调度,并根据先进先出的规则执行,这样就可以保证线程的顺序执行了。