Join与CountDownLatch

join方法

Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行。

public class TestJoin {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName());
                }
            }
        });
        t.start();
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"--------"+i);
            if(i == 20){
                try {
                    t.join();
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
    }
}
运行结果:

main--------15
main--------16
main--------17
main--------18
main--------19
main--------20
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
上面的例子说明,当i==20时,主线程被阻塞,直到线程t结束,主线程进入就绪状态。


countDownLatch

闭锁:闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态。也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成。

CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。import java.util.concurrent.Callable;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.FutureTask;

/**
 * Created by admin on 2017/7/20.
 */
public class TestCountLatch {
    public static void main(String[] args) {
        int ProductNum = 0;
        CountDownLatch latch = new CountDownLatch(1);
        FutureTask<Integer> result = new FutureTask<Integer>(new QueryProductNum(latch));
        new Thread(result).start();
        try {
            latch.await();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        try {
            ProductNum = result.get();
        }catch (Exception e){
            e.printStackTrace();
        }
        if(ProductNum>0){
            System.out.println("库存查询完毕,可以下单");
        }else {
            System.out.println("库存不足");
        }
    }
}

class QueryProductNum implements Callable{
    CountDownLatch latch = null;

    public QueryProductNum(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public Integer call() {
        try {
            Thread.sleep(10000);
            System.out.println("库存查询完毕");
        }catch (InterruptedException e){
            e.printStackTrace();
        }finally{
            latch.countDown();
        }
        return 1;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章