线程按指定顺序执行

2019-05-30  本文已影响0人  Hogwarts1024

在多线程中线程的执行是CPU随机调度的,无法指定线程的执行顺序,比如我们要让多线程按顺序执行输出

        Thread thread1 = new Thread(() -> System.out.println(Thread.currentThread().getName()), "thread1");
        Thread thread2 = new Thread(() -> System.out.println(Thread.currentThread().getName()), "thread2");
        Thread thread3 = new Thread(() -> System.out.println(Thread.currentThread().getName()), "thread3");

        thread1.start();
        thread2.start();
        thread3.start();

这段代码的输出顺序是未知的,可能是123,可能是213也可能是其它情况,我们无法保证哪一个线程会最先执行
这种情况下要保证顺序输出就要求Thread2在Thread1结束后执行,Thread3在Thread2完成后执行

使用Thread的join()方法

    public static void main(String[] args) throws InterruptedException {

        Thread thread1 = new Thread(() -> System.out.println(Thread.currentThread().getName()), "thread1");
        Thread thread2 = new Thread(() -> System.out.println(Thread.currentThread().getName()), "thread2");
        Thread thread3 = new Thread(() -> System.out.println(Thread.currentThread().getName()), "thread3");

        thread1.start();
        thread1.join();
        thread2.start();
        thread2.join();
        thread3.start();

    }

join方法会阻塞直到该线程执行结束

来看一下Thread类内部的join()方法

    public final void join() throws InterruptedException {
        join(0);
    }
    
    public final synchronized void join(long millis) throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

当调用join()方法时,millis参数为0,表示当当前线程未结束时,会一直执行wait()方法阻塞主线程,wait()是native方法由其它语言实现

public final native void wait(long timeout) throws InterruptedException;

当timeout参数为0时会无限期等待

使用单线程的线程池

    public static void main(String[] args) throws InterruptedException {

        Thread thread1 = new Thread(() -> System.out.println("1"));
        Thread thread2 = new Thread(() -> System.out.println("2"));
        Thread thread3 = new Thread(() -> System.out.println("3"));

        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(thread1);
        executorService.submit(thread2);
        executorService.submit(thread3);
        executorService.shutdown();
    }

关于线程池 ThreadPoolExecutor

上一篇下一篇

猜你喜欢

热点阅读