java控制并发量,java信号量使用案例

  java控制并发量,java信号量使用案例

  Semapher信号量也是爪哇中的一个同步器,与闭锁和自行车搬运工不同的是,它内部的计数器是递增的,并且在一开始初始化信号传达者时可以指定一个初始值,但是并不需要知道需要同步的线程个数,而是在需要同步的地方调用获得方法时指定需要同步的线程个数。

  我们通过下面一个例子来看一下Semapher效果:

  导入Java。util。并发。执行服务;导入Java。util。并发。遗嘱执行人;导入Java。util。并发。旗语;公共类信号量测试{私有静态信号量=新信号量(0);公共静态void main(String[]args)抛出中断异常{ ExecutorService ExecutorService=executors。newfixedthreadpool(2);执行服务。submit(new Runnable(){ @ Override public void run(){ try { system。出去。println(线程。当前线程() over );semaphore.release()。} catch(Exception e){ e . printstacktrace();} } });执行服务。submit(new Runnable(){ @ Override public void run(){ try { system。出去。println(线程。当前线程() over );semaphore.release()。} catch(Exception e){ e . printstacktrace();} } });旗语。获取(2);所有子线程结束!);执行服务。关闭();}}

  如上代码首先创建了一个信号量实例,构造函数的入参为0,说明当前信号量计数器的值为0。然后,主要函数向线程池添加两个线程任务,在每个线程内部调用信号量的获得方法,传参为2说明调用获得方法的线程会一直阻塞,知道信号量的技术变为2才会返回。如果构造旗语时,传递的参数为n,并在M个线程中调用了该信号量的释放;排放;发布方法,那么在调用获得使M个线程同步时传递的参数应该是M N。

  下面举例子来模拟CycliBarrier复用的功能,代码如下:

  导入Java。util。并发。执行服务;导入Java。util。并发。遗嘱执行人;导入Java。util。并发。旗语;公共类信号量{私有静态信号量信号量=新信号量(0);公共静态void main(String[]args)抛出中断异常{ ExecutorService ExecutorService=executors。newfixedthreadpool(2);执行服务。submit(new Runnable(){ @ Override public void run(){ try { system。出去。println(线程。当前线程()“任务结束”);semaphore.release()。} catch(Exception e){ e . printstacktrace();} } });执行服务。submit(new Runnable(){ @ Override public void run(){ try { system。出去。println(线程。当前线程()“任务结束”);semaphore.release()。} catch(Exception e){ e . printstacktrace();} } });旗语。获取(2);System.out.println(任务英语字母表中第一个字母结束);执行服务。submit(new Runnable(){ @ Override public void run(){ try { system。出去。println(线程。当前线程()“B任务结束”);semaphore.release()。} catch(Exception e){ e . printstacktrace();} } });执行服务。submit(new Runnable(){ @ Override public void run(){ try { system。出去。println(线程。当前线程()“B任务结束”);semaphore.release()。} catch(Exception e){ e . printstacktrace();} } });旗语。获取(2);System.out.println(任务仓库结束);执行服务。关闭();}}

  如上代码首先将线程英语字母表中第一个字母和线程仓库加入到线程池。主线程执行代码(1)后被阻塞。线程英语字母表中第一个字母和线程仓库调用放方法后信号量的值变为了2,这时候主线程的阿基雷方法会在获取到注射毒品个信号量后返回(返回后当前信号量值为0)。然后主线程添加线程英语字母表中第三个字母和线程英语字母表中第四个字母到线程池,之后主线程执行代码(2)后被阻塞(因为主线程要获取注射毒品个信号量,而当前信号量个数为0)。当线程英语字母表中第三个字母和线程英语字母表中第四个字母执行完放方法后,主线程才返回。从本例子可以看出,旗语在某种程度上实现了栅栏的复用功能。

  到此这篇关于爪哇并发编程信号量Semapher的文章就介绍到这了,更多相关爪哇信号处理器内容请搜索盛行信息技术以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行它!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: