美文网首页
线程按指定顺序执行

线程按指定顺序执行

作者: Hogwarts1024 | 来源:发表于2019-05-30 17:29 被阅读0次

在多线程中线程的执行是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

相关文章

  • 线程按指定顺序执行

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

  • Android线程池使用

    一:无大小限制的线程池执行效果如下 二:限制按顺序来执行任务的线程池效果如下 四:按指定个数来执行任务的线程池效果...

  • 【基础】练习册51-Python3_单线程:按顺序执行任务

    单线程:按顺序执行任务 代码如下: #coding=utf-8#单线程:按顺序执行任务from time impo...

  • iOS 多线程-CGD

    串行队列同步执行,不开启新线程,任务按顺序执行 串行队列异步执行,会开启新线程(1个),任务按照顺序执行 并行队列...

  • 图解 Java 线程安全

    什么是线程 按操作系统中的描述,线程是 CPU 调度的最小单元,直观来说线程就是代码按顺序执行下来,执行完毕就结束...

  • 7张图带你轻松理解Java 线程安全

    / 什么是线程 / 按操作系统中的描述,线程是 CPU 调度的最小单元,直观来说线程就是代码按顺序执行下来...

  • 3个线程按顺序执行

    测试代码: 使用Lock实现:

  • iOS 按顺序异步执行线程

    GCD方式,关键是信号量的三个重要用法:创建信号量为0dispatch_semaphore_t sema = di...

  • Java多线程中join方法的理解

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用...

  • 多线程的_join()方法

    线程的合并指的是:将指定的线程加入到当前的线程之中,可以将两个交替执行的线程合并为顺序执行的线程,如果在线程B中调...

网友评论

      本文标题:线程按指定顺序执行

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