控制多线程执行顺序

  • 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执行的

想要控制线程的执行顺序应该怎么做?

  1. 使用join()方法
  2. 使用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);  }

其作用类似于线程队列,提交任务到队列,线程池负责调度,并根据先进先出的规则执行,这样就可以保证线程的顺序执行了。