前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >控制多线程执行顺序

控制多线程执行顺序

作者头像
suveng
发布2019-09-18 14:27:34
1.1K0
发布2019-09-18 14:27:34
举报

版权声明:本文为博主原创文章,遵循 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()方法

代码语言:javascript
复制
public void joinTest() throws InterruptedException {
//        通过join() 方法保证线程的顺序,但是这样子就和单线程没什么区别了。
//        join()是让主线程等待子线程结束后 继续运行
        thread1.start();
        thread1.join();

        thread2.start();
        thread2.join();

        thread3.start();
        thread3.join();
    }

join()是让主线程等待子线程结束后,继续运行。

使用SingleThreadExecutor线程池

代码语言:javascript
复制
/**
 * 通过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);
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年11月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 控制多线程的执行顺序
    • 示例代码的码云地址:https://gitee.com/suwenguang/test/blob/master/fuxi/src/main/java/多线程/控制多线程的顺序执行/App.java
      • 想要控制线程的执行顺序应该怎么做?
        • 使用join()方法
          • 使用SingleThreadExecutor线程池
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档