JUC之线程顺序执行的2种方式【CountDownLatch、Thread.join()】

简介: JUC之线程顺序执行的2种方式【CountDownLatch、Thread.join()】

JUC之线程顺序执行


方式一:使用Thread中的join()

join() 用于不断让当前线程等待join线程之行结束。其原理就是不停的检查join线程是否存活,如果join线程存活则让当前线程永远等待。其中源码中wait(0)表示永远等待下去。直到线程被唤醒。

1.png

代码实现如下

public class ThreadSequentialExecutionTest {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("T1 test.");
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("T2 test.");
            }
        });
        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("T3 test.");
            }
        });
        t1.start();
        t2.start();
        t3.start();
        t1.join();
        t2.join();
        t3.join();
    }
}

结果如下

T1 test.
T3 test.
T2 test.

方式二:使用jdk1.5之后的CountDownLatch

使用这个api也可以实现线程的join功能,并且比join功能更多。
 当我们调用CountDownLatch的countDown方法时,计数器会减一,CountDownLatch的await方法会阻塞当前线程,直到计数器变为0,再次调用await()便不会阻塞当前线程。countDown()可以使用在任何地方。
 当某个线程处理的比较慢,我们不能让主线程一直阻塞等待,await(long time, TimeUtil unit)在等待特定时间后,将不会阻塞当前线程。join()也有类似方法。


代码实现

import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
    //接受一个int类型的参数作为计数器。如果你想等待n个点完成就需要在构造函数中传入n
    private static CountDownLatch countDownLatch = new CountDownLatch(4);
    public static void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(1);
                countDownLatch.countDown();
                System.out.println(2);
                countDownLatch.countDown();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(3);
                countDownLatch.countDown();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(4);
                countDownLatch.countDown();
            }
        }).start();
        countDownLatch.await();
        System.out.println(5);
    }
}

结果输出

1
2
3
4
5
相关文章
|
22天前
|
Java 测试技术
CountDownLatch、CyclicBarrier让线程听我号令
CountDownLatch、CyclicBarrier让线程听我号令
46 0
|
9天前
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
27 4
|
10天前
|
安全 Java 程序员
Java多线程基础-17:简单介绍一下JUC中的 ReentrantLock
ReentrantLock是Java并发包中的可重入互斥锁,与`synchronized`类似但更灵活。
31 0
|
10天前
|
Java 程序员
Java多线程基础-16:简述Java并发编程JUC中的Callable接口
Callable接口是Java中用于描述带有返回值任务的接口,与Runnable相对,后者无返回值。Callable的call()方法用于执行具体任务并返回结果。
23 0
|
22天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
33 0
|
22天前
|
存储 安全 Java
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)(下)
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)(下)
45 0
|
22天前
|
存储 安全 Java
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)(上)
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)
38 0
|
22天前
|
存储 Java 数据库连接
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
线程通信(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
44 0
|
22天前
|
安全 Java C++
JUC(java.util.concurrent)的常见类(多线程编程常用类)
JUC(java.util.concurrent)的常见类(多线程编程常用类)
|
22天前
|
安全 Java
多线程(进阶三:JUC)
多线程(进阶三:JUC)
49 0