美文网首页JAVA基础程序员
如何控制多线程执行的顺序?

如何控制多线程执行的顺序?

作者: wwbovo | 来源:发表于2019-04-04 16:48 被阅读7次

先看一段代码:

public class TestThread {
    static Thread thread1=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程1");
        }
    });
    static Thread thread2=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程2");
        }
    });
    static Thread thread3=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程3");
        }
    });
    public static void main(String[] args) {
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

执行结果:

我是线程2
我是线程3
我是线程1

可以看到线程的执行顺序是随机的。
查阅资料控制多线程执行顺序有以下两种方法:

方法1:调用join方法

public class TestThread {
    static Thread thread1=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程1");
        }
    });
    static Thread thread2=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程2");
        }
    });
    static Thread thread3=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程3");
        }
    });
    public static void main(String[] args) throws Exception{
        thread1.start();
        thread1.join();
        thread2.start();
        thread2.join();
        thread3.start();
    }
}

执行结果:

我是线程1
我是线程2
我是线程3

可以看到线程按照顺序执行。

join方法:让主线程等待子线程运行结束后再继续运行

原理剖析:在main方法中,先是调用了t1.start方法,启动t1线程,随后调用t1的join方法,main所在的主线程就需要等待t1子线程中的run方法运行完成后才能继续运行,所以主线程卡在t2.start方法之前等待t1程序。等t1运行完后,主线程重新获得主动权,继续运行t2.start和t2.join方法,与t1子线程类似,main主线程等待t2完成后继续执行,如此执行下去,join方法就有效的解决了执行顺序问题。因为在同一个时间点,各个线程是同步状态。

方法2:Excutors.newSingleThreadExecutor()

public class TestThread {
    static Thread thread1=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程1");
        }
    });
    static Thread thread2=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程2");
        }
    });
    static Thread thread3=new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是线程3");
        }
    });

    static ExecutorService executorService = Executors.newSingleThreadExecutor();

    public static void main(String[] args) throws Exception{
        executorService.submit(thread1);
        executorService.submit(thread2);
        executorService.submit(thread3);
    }
}

执行结果:

我是线程1
我是线程2
我是线程3

可以看到线程按照顺序执行。
原理剖析:
利用并发包里的Excutors的newSingleThreadExecutor产生一个单线程的线程池,而这个线程池的底层原理就是一个先进先出(FIFO)的队列。代码中executor.submit依次添加了123线程,按照FIFO的特性,执行顺序也就是123的执行结果,从而保证了执行顺序。

相关文章

  • 如何控制多线程的执行顺序

    方法一:join join方法:让主线程等待子线程运行结束后再继续运行 方法二:Excutors.newSingl...

  • 如何控制多线程的执行顺序?

    我们先来看下面的程序: 以上运行程序的结果是什么呢? 有人说结果如下: main开始运行thread1运行thre...

  • 如何控制多线程执行的顺序?

    先看一段代码: 执行结果: 可以看到线程的执行顺序是随机的。查阅资料控制多线程执行顺序有以下两种方法: 方法1:调...

  • 线程 -- join 功能

    由于多线程的执行是无序的,因此使用 join 对控制多个线程的执行顺序非常关键。 举个例子: def T1_job...

  • unittest测试框架

    一、使用规则 二、重要概念 三、用例执行 1、执行顺序 2、如何控制用例的执行顺序 方法一:通过testSuite...

  • Java基础总结3-多线程

    多线程 1、进程和线程 进程:正在进行的成序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制...

  • python——多线程

    多线程-threading 子类完成创建多线程 线程的执行顺序也是主线程和各个子线程随机执行,顺序不确定 线程对全...

  • 03-unittest中case的执行顺序控制

    1.默认测试方法都是以test开头 ,按照顺序执行 如何控制case按照自定义的顺序执行 或者

  • day11-01/02/03多线程(概述)

    一、多线程 进程:是一个正在执行中的程序每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元线...

  • ABC三个线程如何保证顺序执行

    介绍 最近看看多线程练习题,练习下多线程,这道题:ABC三个线程如何保证顺序执行。三个线程同时启动,然后按照顺序执...

网友评论

    本文标题:如何控制多线程执行的顺序?

    本文链接:https://www.haomeiwen.com/subject/lzkqiqtx.html