当前位置: 首页 > 后端技术 > Java

多线程控制countDownLatch、CyclicBarrier、Semaphore总结

时间:2023-04-01 13:25:40 Java

countDownLatch函数:用于控制多线程执行的协调性,即线程先后依赖的问题。例如,主线程需要等待多个子线程执行完毕,才能继续执行。示例代码(代码关键点注释)publicclassCountDownTest{publicstaticvoidmain(String[]args){longstart=System.currentTimeMillis();System.out.println("开始="+开始);整数=100;LinkedBlockingQueuelbq=newLinkedBlockingQueue();lbq.stream().count();finalCountDownLatchcdl=newCountDownLatch(num);//参数为线程数for(inti=0;i{System.out.println("thread:"+num);cdl.countDown();//该方法为CountDownLatch的线程数-1}).start();}尝试{cdl.await();}catch(InterruptedExceptione){e.printStackTrace();}//由await()调用以确保后面的输出是最后一个输出longend=System.currentTimeMillis();System.out.println("结束="+结束);System.out.println("使用"+(结束-开始));}}CyclicBarrier功能:控制多个线程统一执行示例代码(代码关键点注释)publicclassCyclicBarrierTest{publicstaticvoidmain(String[]args){intnum=5;CyclicBarriercyclicBarrier=newCyclicBarrier(num);for(inti=0;i{try{Thread.sleep(num*1000);System.out.println(newDate().getTime());//下面的调用会让线程参与fence控制,等待fence中所有线程初始化完成一起执行//预期结果是多个线程输出的时间戳完全一样cyclicBarrier.await();}catch(InterruptedExceptione){e.printStackTrace();}catch(BrokenBarrierExceptione){e.printStackTrace();}}).start();}}}信号量功能:控制多个线程同时执行的个数worker和console类似,worker数量大于console的示例代码(代码关键点注释)publicclassSemaphoreTest{publicstaticvoidmain(String[]args){intnum=3;//可执行线程数(操作控制台)intnumThread=20;//可以参与的线程数(worker)Semaphoresemaphore=newSemaphore(num);for(inti=0;i{try{semaphore.acquire();//Workers去工作并占用一个控制台System.out.println("Workernumber:"+no+"isworking");Thread.sleep(5000);System.out.println("Workernumber:"+no+"isoffduty");semaphore.release();//worker下班,释放控制台}catch(Exceptione){e.printStackTrace();}}).start();}}}