Java中线程监听其他子线程运行状态的方法-- CountDownLatch

 

CountDownLatch类位于java.util.concurrent包下,使用CountDownLatch可以实现一个类似计数器的功能。

// 构造参数为计数总量
final CountDownLatch latch = new CountDownLatch(2);

创建一个CountDownLatch的实例,构造其中填入计数总量。

// 在需要监听其他线程运行状态的线程中使用
latch.await();

// 如果超过某个时间后,计数依然没到0,则
await(long timeout, TimeUnit unit);

这个方法会使当前线程进入阻塞状态,直到CountDownLatch的计数值为0。

// 使计数器数值-1,在其他被监听的线程中调用
latch.countDown();

那么写个例子。

package com.wy.test.concurrent;

import java.util.concurrent.CountDownLatch;

public class MyThread implements Runnable {
    private final CountDownLatch latch;
    public MyThread(CountDownLatch latch){
        this.latch = latch;
    }
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "正在运行");
        try {
            Thread.sleep(3000);  // 线程睡眠3秒
            System.out.println(Thread.currentThread().getName() + "运行结束");
            latch.countDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
package com.wy.test.concurrent;

import java.util.concurrent.CountDownLatch;

/**
 * @author Wang Yu
 * CountDownLatch 类可以监听线程的运行状态
 */
public class TestCountDownLatch {
    public static void main(String[] args) {
        final CountDownLatch latch = new CountDownLatch(2);

        Thread thread1 = new Thread(new MyThread(latch));

        Thread thread2 = new Thread(new MyThread(latch));

        thread1.setName("线程1");
        thread2.setName("线程2");

        thread.start();
        thread1.start();
        try {
            System.out.println("等待两个线程执行条件结束");
            // 使主线程阻塞,直到监听的线程执行完毕(计数值为0)
            latch.await();  
            System.out.println("两个线程执行完毕");
            System.out.println("继续执行主线程方法");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

运行结果

Java中线程监听其他子线程运行状态的方法-- CountDownLatch_第1张图片

 

参考博客  http://www.importnew.com/21889.html

 

你可能感兴趣的:(Java中线程监听其他子线程运行状态的方法-- CountDownLatch)