推荐安卓开发神器(里面有各种UI特效和android代码库实例)
当涉及到多线程的时候,一个经常出现的问题就是线程同步,这里介绍android一个很简单的多线程同步方案-------------CountDownLatch
我们直接看官方例子。这个例子有两个功能,
1.N个子线程等待主线程进行一些初始化工作doSomethingInit()之后,才运行子线程
2.主线程等待N个子线程都结束之后才继续做其它的事情。
classDriver{// ... voidmain()throwsInterruptedException{ CountDownLatchstartSignal=newCountDownLatch(1); CountDownLatchdoneSignal=newCountDownLatch(N);
for(inti=0;i<N;++i)// create and start threads newThread(newWorker(startSignal,doneSignal)).start();
doSomethingInit(); // 做初始化工作 startSignal.countDown(); // 让所有子线程运行 doneSignal.await(); // 等待所有子线程结束
doSomethingElse(); //做其它事情。
} }
classWorkerimplementsRunnable{ privatefinalCountDownLatchstartSignal; privatefinalCountDownLatchdoneSignal; Worker(CountDownLatchstartSignal,CountDownLatchdoneSignal){ this.startSignal=startSignal; this.doneSignal=doneSignal; } publicvoidrun(){ try{ startSignal.await(); doWork(); doneSignal.countDown(); }catch(InterruptedExceptionex){}// return; }
voiddoWork(){...} }
CountDownLatch类只有一个成员变量,就是一个整形值,是个计数器,而且成员函数也只有两个经常调用的函数。 1.countDown,让计数器减去 2.await。等待计数器为0,然后继续从await后面运行。 原理就是这样,我们来看代码。 CountDownLatchstartSignal=newCountDownLatch(1); CountDownLatchdoneSignal=newCountDownLatch(N); for(inti=0;i<N;++i)// create and start threads newThread(newWorker(startSignal,doneSignal)).start(); 这里主线程开启了N个线程,并调用了start函数,同时传入两个用于同步的CountDownLatch,我们看线程里面有 startSignal.await(); doWork(); doneSignal.countDown(); 什么意思呢?就是startSignal.await()让该线程等待,直到startSignal里面的计数器为0才开始运行,那他什么时候为0呢?我们在看到主线程有
doSomethingInit(); // 做初始化工作 startSignal.countDown(); // 让所有子线程运行 startSignal是在主线程做了doSomethingInit()这个函数之后,调用 startSignal.countDown()让startSignal的计数器减1,我们看startSignal的计数器初始值是多少, CountDownLatchstartSignal=newCountDownLatch(1); 不错,是1,也就是,只要主线程一执行startSignal.countDown(),startSignal的计数就马上变成0,所有子线程就运行起来了,因为所有的子线程都在等startSignal它变成0。
当所有子线程都运行起来之后,我们来看现在主线才执行到哪儿了: doneSignal.await(); // 等待所有子线程结束 不错,主线程又在等在中,等待doneSignal的计数器变成0,我们再来看doneSignal的初始值是多少 CountDownLatchdoneSignal=newCountDownLatch(N); 是N,也就是说要执行N次的doneSignal.countDown,主线程才能继续运行,我们来看doneSignal的计数器在那里减少的,看到子线程里面 doWork(); doneSignal.countDown(); 子线程在执行了doWork()之后,就会doneSignal.countDown();让doneSignal的计数器减1,一个子线程自会执行一次doneSignal.countDown();但是N个子线程就执行了N次doneSignal.countDown();所以当所有子线程都执行过doneSignal.countDown();之后,doneSignal的计数器就变成0了,然后主线程就可以继续运行了。 做其它的事情。 doSomethingElse(); //做其它事情。 |
相关推荐
利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949
本篇文章主要介绍了Java中多线程同步类 CountDownLatch的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
主要介绍了Java多线程编程之CountDownLatch同步工具使用实例,需要的朋友可以参考下
NULL 博文链接:https://cpjsjxy.iteye.com/blog/2272451
在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:
递减锁存器CountDownLatch的使用以及注意事项!
1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 2.3 countDown()方法 实现多线程任务的同步 3.1 场景介绍 3.2 使用CountDownLatch实现同步 ...
主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下
并发编程之CountDownLatch
主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
具有countDownLatch的线程同步模式
CountDownLatch计数器闭锁是一个能阻塞主线程,让其他线程满足特定条件下主线程再继续执行的线程同步工具。 Latch闭锁的意思,是一种同步的工具类。类似于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭着的,不...
目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...
主要介绍了Java线程并发工具类CountDownLatch原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
上文介绍了CountDownLatch,CountDownLatch虽然可以实现多个线程同步,但是只能使用一次。而本文所要介绍的CycliBarrier,比CountDownLatch强大许多,可以使用多次。下面会从源码角度通透解析CyclicBarrier,觉得不错...
主要介绍了JAVA多线程CountDownLatch的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
尚硅谷_JUC线程高级_CountDownLatch 闭锁 ·6. 实现 Callable 接口 ·7. 尚硅谷_JUC线程高级_同步锁 Lock ·8. 尚硅谷_JUC线程高级_生产者消费者案例-虚假唤醒 ·9. 尚硅谷_JUC线程高级_Condition 线程通信 ·10. ...
javar的CountDownLatch是个计数器,它有一个初始数,等待这个计数器的线程必须等到计数器倒数到零时才可继续。