多线程同步的三大神器
2016-08-30 16:45
253 查看
本文出自
代码大湿
代码大湿
实现多个线程同步一般有三种方式(CountDownLatch,CyclicBarrier,Semaphore)
结果
i
以上是主线程等到其它5个线程都执行完成了,然后再执行。
结果
结果
本文出自
代码大湿
代码大湿
欢迎与广大 coder 交流技术
QQ:1228935432
WX:WX1228935432
代码大湿
代码大湿
实现多个线程同步一般有三种方式(CountDownLatch,CyclicBarrier,Semaphore)
1:CountDownLatch一般用于一个线程等待其他多个线程的同步。其countDown方法将计数器减1。await方法在计数器不为0的时候都是阻塞状态(await不改变计数器的值)。 2:CyclicBarrier的await将计数器值加1,其值不为构造器中的参数的时候是阻塞的。而且CyclicBarrier还可以重复利用。等到计数器为0的时候开始执行。 3: Semaphore(信号量)是实现多线程的资源共享。
看CountDownLatch的例子:
package demo; import java.util.concurrent.CountDownLatch; public class Main { public static void main(String[] args) { CountDownLatch countDownLatch=new CountDownLatch(5); for(int i=0;i<5;i++){ new Thread(new r(countDownLatch)).start(); } try { countDownLatch.await(); System.out.println("主线程可以执行了"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //CountDownLatch实现同步 class r implements Runnable{ private CountDownLatch countDownLatch; public r(CountDownLatch countDownLatch){ this.countDownLatch=countDownLatch; } @Override public void run() { System.out.println("进程 "+Thread.currentThread().getName()+"正在执行"); try { Thread.sleep(3000); System.out.println("进程 "+Thread.currentThread().getName()+"执行完"); countDownLatch.countDown(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
结果
i
以上是主线程等到其它5个线程都执行完成了,然后再执行。
接下来看CyclicBarrier(回环删栏)。其await方法将计数器加1,在计数器的值不是构造参数中的值的时候是阻塞状态。等到计数器为10开始执行。可以等待多个线程达到同一状态然后进行后面的任务。下面直接看例子:
public class Main { public static void main(String[] args) { CyclicBarrier cyclicBarrier=new CyclicBarrier(5); for(int i=0;i<5;i++){ new Thread(new r_Cyclic(cyclicBarrier)).start(); } } } //CyclicBarrier实现同步 class r_Cyclic implements Runnable{ private CyclicBarrier cyclicBarrier; public r_Cyclic(CyclicBarrier cyclicBarrier) { this.cyclicBarrier=cyclicBarrier; } @Override public void run() { System.out.println("进程" +Thread.currentThread().getName()+"开始执行"); try { Thread.sleep(2000); System.out.println("进程" +Thread.currentThread().getName()+"开始等待"); cyclicBarrier.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("进程" +Thread.currentThread().getName()+"执行完"); } }
结果
接下来看Semaphore(信号量)。。有8个任务,但是只有5个资源
public class Main { public static void main(String[] args) { Semaphore semaphore=new Semaphore(5); //8个任务,但是只有5个资源 for(int i=0;i<8;i++){ new Thread(new r_sema(semaphore)).start(); } } } //Semaphore(信号量)实现资源共享 class r_sema implements Runnable{ private Semaphore semaphore; public r_sema(Semaphore semaphore) { this.semaphore=semaphore; } @Override public void run() { // TODO Auto-generated method stub try { //获得一个许可 semaphore.acquire(); System.out.println("进程 "+Thread.currentThread().getName()+"正在执行任务"); Thread.sleep(4000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("进程 "+Thread.currentThread().getName()+"释放一个许可"); //释放一个许可 semaphore.release(); } }
结果
本文出自
代码大湿
代码大湿
欢迎与广大 coder 交流技术
QQ:1228935432
WX:WX1228935432
相关文章推荐
- 多线程同步的三大神器
- shell编程三大神器之grep
- virtualenv、fabric 和 pip 是 pythoneer 的三大神器
- Python 三大神器
- Python三大神器之pip的安装
- android ios wp三大平台神器软件分享
- shell编程三大神器之grep
- <Pro .NET MVC4> 三大工具之依赖注入神器——Ninject
- Python 三大神器
- WEB渗透测试之三大漏扫神器
- WEB渗透测试之三大漏扫神器
- Python三大神器之virtual使用
- python三大神器
- 机器学习时代的三大神器:GBDT,XGBOOST和LightGBM
- Python三大神器之一:virtualenv虚拟环境
- Python项目部署的三大神器
- java三大神器之拦截器
- shell编程三大神器之sed
- python 三大神器
- 洛谷-语文成绩-[有奖]洛谷5月月赛:kkksc03的三大神器