JAVA concurrent包下Semaphore、CountDownLatch等用法

  • CountDownLatch 跟join的区别

CountDownLatch用处跟join很像,但是CountDownLatch更加灵活,如果子线程有多个阶段a、b、c; 那么我们可以实现在a阶段完成后(在a阶段后 ,b、c阶段之前, latch.countDown();),就可以往下运行,主线程并不用等子线程把b、c阶段都跑完。
latch.countDown() 其实是state -1 操作,latch.await() 其实一直在判断state == 0 如果为0就不再等待向下执行,基于AQS实现。
以下代码展示的是跟join()用处相同。

import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest {
    public static void main(String[] args) {
        final CountDownLatch latch = new CountDownLatch(2);

        new Thread() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread().getName() + "sleep 3s");
                    Thread.sleep(3000);
                    latch.countDown();

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }.start();


        new Thread() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread().getName() + "sleep 3s");
                    Thread.sleep(3000);
                    latch.countDown();

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();


        System.out.println(Thread.currentThread().getName() + "我是main线程");
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("main线程结束了。。。");

    }
}
  • CountDownLatchTest result
main我是main线程
Thread-1sleep 3s
Thread-0sleep 3s
main线程结束了。。。
  • 感觉Semaphore类,可以做限流,像令牌token一样
import java.util.concurrent.Semaphore;

public class SemaphoreTest {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(5);
        for (int i = 0; i < 8; i++) {
            new Work(i,semaphore).start();
        }
    }


    static class Work extends Thread {

        int num;
        Semaphore sem;

        public Work(int num, Semaphore sem) {
            this.num = num;
            this.sem = sem;
        }

        @Override
        public void run() {
            try {
                sem.acquire();
                System.out.println(Thread.currentThread().getName() +" worker.NO."+ String.valueOf(num)+" 占用了机器,开始生产。。。");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() +" worker.NO."+ String.valueOf(num)+" 释放了机器。");
            sem.release();
        }
    }



  • Semaphore result
Thread-0 worker.NO.0 占用了机器,开始生产。。。
Thread-1 worker.NO.1 占用了机器,开始生产。。。
Thread-2 worker.NO.2 占用了机器,开始生产。。。
Thread-3 worker.NO.3 占用了机器,开始生产。。。
Thread-4 worker.NO.4 占用了机器,开始生产。。。
Thread-0 worker.NO.0 释放了机器。
Thread-5 worker.NO.5 占用了机器,开始生产。。。
Thread-1 worker.NO.1 释放了机器。
Thread-6 worker.NO.6 占用了机器,开始生产。。。
Thread-2 worker.NO.2 释放了机器。
Thread-7 worker.NO.7 占用了机器,开始生产。。。
Thread-3 worker.NO.3 释放了机器。
Thread-4 worker.NO.4 释放了机器。
Thread-5 worker.NO.5 释放了机器。
Thread-7 worker.NO.7 释放了机器。
Thread-6 worker.NO.6 释放了机器。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 说服自己的行动力 相信在座每一个位都比我了解行动力这个词了,我也不多嘴了,切入主题,说服自己的行动力,主要在与说服...
    胖二星阅读 2,924评论 0 1
  • 有时候突然感觉自己无能为力,感觉自己那么微不足道,在周围别人都很优秀都很努力的圈子里,自己永远都是追赶不上。...
    芳心微语阅读 1,098评论 0 1
  • 今天看到红楼梦第二十七回,宝钗扑蝶,撞上小红和坠儿悄悄谈贾芸。眼看她快快被发现,却使了招金蝉脱壳,装作来寻林...
    荷兰胖豆阅读 2,490评论 0 17