当前位置:   article > 正文

多线程顺序运行的 4 种方法_多线程顺序执行

多线程顺序执行

1、在子线程中通过join()方法指定顺序

通过join()方法使当前线程“阻塞”,等待指定线程执行完毕后继续执行。

举例:在线程thread2中,加上一句thread1.join(),其意义在于,当前线程2运行到此行代码时会进入阻塞状态,直到线程thread1执行完毕后,线程thread2才会继续运行,这就保证了线程thread1与线程thread2的运行顺序。

复制代码
public class ThreadJoinDemo {
    public static void main(String[] args) {
// 下面三行代码顺序可随意调整,程序运行结果不受影响,因为我们在子线程中通过“join()方法”已经指定了运行顺序。 thread3.start(); thread2.start(); thread1.start(); } static final Thread thread1 = new Thread(new Runnable() { @Override public void run() { System.out.println("打开冰箱!!!"); } }); static final Thread thread2 = new Thread(new Runnable() { @Override public void run() { try{ thread1.join(); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("拿出一瓶牛奶!!!"); } }); static final Thread thread3 = new Thread(new Runnable() { @Override public void run() { try{ thread2.join(); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("关上冰箱!!!"); } }); }
// 运行结果:
打开冰箱!!!
拿出一瓶牛奶!!!
关上冰箱!!!
复制代码

2、在主线程中通过join()方法指定顺序

简单说一下子线程与主线程的区别,子线程指的是发生在Thread内部的代码,主线程指的是发生在main函数中的代码。

我们可以在main函数中通过join()方法让主线程阻塞等待以达到指定顺序执行的目的。

复制代码
public class ThreadJoinDemo {
    public static void main(String[] args) throws InterruptedException {
        thread1.start();
        thread1.join();
        thread2.start();
        thread2.join();
        thread3.start();
    }
    static final Thread thread1 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("打开冰箱!!!");
        }
    });
    static final Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("拿出一瓶牛奶!!!");
        }
    });
    static final Thread thread3 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("关上冰箱!!!");
        }
    });
}
// 输出结果:
打开冰箱!!!
拿出一瓶牛奶!!!
关上冰箱!!!
复制代码

3、通过倒数计时器CountDownLatch实现

CountDownLatch 通过计数器提供了更灵活的控制,只要检测到计数器为 0 当前线程就可以往下执行而不用管相应的 thread 是否执行完毕。

复制代码
public class ThreadCountDownLatchDemo {
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> CountDownLatch countDownLatch1 = <span style="color: rgba(0, 0, 255, 1)">new</span> CountDownLatch(1<span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> CountDownLatch countDownLatch2 = <span style="color: rgba(0, 0, 255, 1)">new</span> CountDownLatch(1<span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 0, 255, 1)">final</span> Thread thread1 = <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
            System.out.println(</span>"打开冰箱!"<span style="color: rgba(0, 0, 0, 1)">);
            <span style="color: rgba(255, 0, 0, 1)">countDownLatch1.countDown();</span>
        }
    });

    </span><span style="color: rgba(0, 0, 255, 1)">final</span> Thread thread2 = <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                <span style="color: rgba(255, 0, 0, 1)">countDownLatch1.await();</span>
                System.out.println(</span>"拿出一瓶牛奶!"<span style="color: rgba(0, 0, 0, 1)">);
                <span style="color: rgba(255, 0, 0, 1)">countDownLatch2.countDown();</span>
            } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

    </span><span style="color: rgba(0, 0, 255, 1)">final</span> Thread thread3 = <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                <span style="color: rgba(255, 0, 0, 1)">countDownLatch2.await();</span>
                System.out.println(</span>"关上冰箱!"<span style="color: rgba(0, 0, 0, 1)">);
            } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">下面三行代码顺序可随意调整,程序运行结果不受影响</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

thread3.start();
thread1.start();
thread2.start();
}
}
// 输出结果:
打开冰箱!
拿出一瓶牛奶!
关上冰箱!

复制代码

4、通过创建单一化线程池 newSingleThreadExecutor()实现

单线程化线程池 ( newSingleThreadExecutor ) 的优点,串行执行所有任务。

复制代码
public class ThreadPoolDemo {

static ExecutorService executorService = Executors.newSingleThreadExecutor();

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> main(String[] args) {
    </span><span style="color: rgba(0, 0, 255, 1)">final</span> Thread thread1 = <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
            System.out.println(</span>"打开冰箱!"<span style="color: rgba(0, 0, 0, 1)">);
        }
    });

    </span><span style="color: rgba(0, 0, 255, 1)">final</span> Thread thread2 =<span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
            System.out.println(</span>"拿出一瓶牛奶!"<span style="color: rgba(0, 0, 0, 1)">);
        }
    });

    </span><span style="color: rgba(0, 0, 255, 1)">final</span> Thread thread3 = <span style="color: rgba(0, 0, 255, 1)">new</span> Thread(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
        @Override
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
            System.out.println(</span>"关上冰箱!"<span style="color: rgba(0, 0, 0, 1)">);
        }
    });
    executorService.submit(thread1);
    executorService.submit(thread2);
    executorService.submit(thread3);
    executorService.shutdown();        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用完毕记得关闭线程池</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

}

}
// 输出结果:
打开冰箱!
拿出一瓶牛奶!
关上冰箱!

复制代码

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号