博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭锁:CountDownLatch和CyclicBarrie、FutureTask
阅读量:6422 次
发布时间:2019-06-23

本文共 2244 字,大约阅读时间需要 7 分钟。

hot3.png

闭锁

    闭锁作用是,在闭锁到达结束之前,会阻止其他线程通过,而到达结束的时候,则打开门,允许其余线程通过。

CountDownLatch

    是一种闭锁实现,是通过计数的形式实现,可以实现一个主线程需要依赖其他多个线程完成后,再继续  执行的功能。下面是自己写的一个很简单的demo:

public static void main(String[] args) {        CountDownLatch counter = new CountDownLatch(3);        for (int i = 0; i < 3; i++) {            Thread thread = new Thread(new Runnable() {                @Override                public void run() {                    try {                        Thread.sleep(5000);                        counter.countDown();                    } catch (Exception e) {                        counter.countDown();                    }                }            });            thread.start();        }        System.out.printf("我在等待三个线程运行完\n");        try {            counter.await();        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.printf("我等完了三个线程运行");    }

CyclicBarrier

     就是相当于设置一道基线,当所有线程都到达这个基线的位置时候,才能继续往下走。例子如下:

public static void main(String[] args) throws Exception {        // 这里Cyclic构造参数里可以传递一个Runnable,意思就是当所有线程都到达的时候,将会执行这个runnable        CyclicBarrier cb = new CyclicBarrier(3, new Runnable() {            @Override            public void run() {                System.out.printf("比赛现在开始~");            }        });        Thread thread1 = new Thread(new Sports(cb, "中单"));        Thread thread2 = new Thread(new Sports(cb, "上单"));        Thread thread3 = new Thread(new Sports(cb, "打野"));        thread1.start();        thread2.start();        thread3.start();    }    public static class Sports implements Runnable {        CyclicBarrier barrier = null;        String name = null;        Sports(CyclicBarrier cb, String name) {            this.barrier = cb;            this.name = name;        }        @Override        public void run() {            try {                System.out.printf(name + "在准备中\n");                Thread.sleep(new Random().nextInt(10) * 1000);                System.out.printf(name + "准备完毕,等待其他位置\n");                barrier.await();            } catch (Exception e) {}        }    }

    运行结果如下:

FutureTask

    FutureTask也可以用来实现闭锁的功能,因为FutureTask的是可以返回结果的,当主线程去调用futureTask.get()的时候,会返回结果,如果线程还没有执行完毕,就会一直阻塞等待,直到拿到结果为止,当然可以设置等待的超时时间。

转载于:https://my.oschina.net/u/3139515/blog/1571273

你可能感兴趣的文章
UIScrollView视差模糊效果
查看>>
大数据计算新贵Spark在腾讯雅虎优酷成功应用解析
查看>>
字典树(Trie tree)
查看>>
2013编程之美全国挑战赛第一场-传话游戏
查看>>
测试之新生入学系统,多一份收获
查看>>
无锁和无等待的定义和例子
查看>>
linux中c语言errno的使用
查看>>
【Mongo】uploadify插件帮助实现批量上传
查看>>
SpriteBuilder&amp;Cocos2D使用CCEffect特效实现天黑天亮过度效果
查看>>
04-Windows频繁打开和关闭端口可能引发的问题 | 07.杂项
查看>>
hibernate总结-映射
查看>>
【SSH项目实战】国税协同平台-5.头像上传功能
查看>>
【云栖大会】青磁:从金融上云到云上金融
查看>>
如何在 ASP.NET 4.6 与 IIS10 中运用 HTTP/2 ?
查看>>
Activiti的引擎与引擎配置对象
查看>>
Vue 学习笔记 (三) -- VueCli 3 项目配置
查看>>
Flutter-BLoC-第三讲
查看>>
html~display的使用
查看>>
iOS开发教你如何删除Xcode中无用的配置文件Provisioning Profiles
查看>>
谁在使用MongoDB
查看>>