多线程信号量同步,java线程同步有几种方法
目录
一、信号同步二、基于时间维度1、CountDownLatch2、CyclicBarrier三、基于信号维度
一、信号同步
多线程很多时候是协作作业。比如四个线程对电商数据分季度统计,统计完成之后,再汇总。如何知道四个线程都执行完成呢,我们可以使用JDK1.5给我们提供的辅助类CountDownLatch(
减少计数)、环状屏障(循环栅栏)、旗语(信号灯)。
二、基于时间维度
1、CountDownLatch
多少个协作线程就初始化闭锁的构造参数是多少。
公共静态void main(String[] args)引发中断的异常{ final int NUM=6;//定义总数量;CountDownLatch CountDownLatch=new CountDownLatch(NUM);for(int I=0;i NUMi ) {新线程(()-{系统。出去。println(线程。当前线程().getName()线程,已执行!);//减少计数countdownlatch。倒计时();},string . value of(I ^ 1))。start();} //等待所有任务完成countdownlatch。await();System.out.println(所有线程任务已经执行完成!);}
2、CyclicBarrier
与减少计数类似
public static void main(String[]args){ final int NUM=6;//定义循环数量及循环完成后的任务(可运行接口实现);循环屏障循环屏障=新循环屏障(NUM,()- { System.out.println(所有线程任务已经执行完成!);});for(int I=0;i NUMi ) {新线程(()-{系统。出去。println(线程。当前线程().getName()线程,已执行!);尝试{ //等待点或障碍点,等待所有任务完成,循环屏障。await();} catch(中断异常e){ e . printstacktrace();} catch(BrokenBarrierException e){ e . printstacktrace();} },string . value of(I ^ 1))。start();} }
三、基于信号维度
信号量,线程与信号是m:n,其中m=n。
导入Java。util。随机;导入Java。util。并发。旗语;导入Java。util。并发。时间单位;/*信号灯* 6个线程,抢占三个信号* */公共类Semaphore demo { public static void main(String[]args){ Semaphore Semaphore=new Semaphore(3);for(int I=0;i6;i ) {新线程(()-{ try { //获取信号旗语。获取();System.out.println(线程: Thread.currentThread().getName() -获取信号);int time=new Random().nextInt(5);System.out.println((线程: Thread.currentThread().getName() -休眠"时间到了!"));时间单位9.25秒. sleep(时间);} catch(中断异常e){ e . printstacktrace();}最后{ //释放信号System.out.println(线程: Thread.currentThread().getName() -释放信号);semaphore.release()。} },string . value of(I ^ 1))。start();} }}首先线程4、1、3获取到信号,线程一释放信号后,线程注射毒品获得信号。线程2、3释放信号后,线程5、6获得信号。
到此这篇关于爪哇详解多线程协作作业之信号同步的文章就介绍到这了,更多相关爪哇信号同步内容请搜索盛行信息技术以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行它!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。