控制多线程执行顺序

个人博客: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);
}

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

    原文作者:suveng
    原文地址: https://blog.csdn.net/qq_37933685/article/details/83619945
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞