Berbilang rangkaian selalunya merupakan operasi kolaboratif. Sebagai contoh, empat utas mengumpul statistik pada data e-dagang setiap suku tahun Selepas statistik selesai, ia diringkaskan. Bagaimana untuk mengetahui bahawa keempat-empat utas telah dilaksanakan? Kita boleh menggunakan kelas tambahan CountDownLatch (
untuk mengurangkan kiraan), CyclicBarrier (penghalang kitaran) dan Semaphore (semaphore) yang disediakan oleh JDK1.5.
Parameter pembinaan CountDownLatch dimulakan mengikut bilangan utas bekerjasama.
public static void main(String[] args) throws InterruptedException { final int NUM=6; //定义总数量; CountDownLatch countDownLatch=new CountDownLatch(NUM); for (int i = 0; i < NUM; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"线程,已执行!"); //减少计数 countDownLatch.countDown(); },String.valueOf(i+1)).start(); } //等待所有任务完成 countDownLatch.await(); System.out.println("所有线程任务已经执行完成!"); }
adalah serupa dengan mengurangkan kiraan
public static void main(String[] args) { final int NUM = 6; //定义循环数量及循环完成后的任务(Runnable接口实现); CyclicBarrier cyclicBarrier = new CyclicBarrier(NUM, () -> { System.out.println("所有线程任务已经执行完成!"); }); for (int i = 0; i < NUM; i++) { new Thread(()->{ System.out.println(Thread.currentThread().getName()+"线程,已执行!"); try { //等待点或障碍点,等待所有任务完成, cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } },String.valueOf(i+1)).start(); } }
Semafor, benang dan isyarat ialah m:n, dengan m>=n.
import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; /*信号灯 * 6个线程,抢占三个信号 * */ public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore=new Semaphore(3); for (int i = 0; i < 6; i++) { new Thread(()->{ try { //获取信号 semaphore.acquire(); System.out.println("线程:"+Thread.currentThread().getName()+"----获取信号"); int time = new Random().nextInt(5); System.out.println(("线程:"+Thread.currentThread().getName()+"----休眠"+time+"s!")); TimeUnit.SECONDS.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); }finally { // 释放信号 System.out.println("线程:"+Thread.currentThread().getName()+"---释放信号"); semaphore.release(); } },String.valueOf(i+1)).start(); } } }
Pertama, utas 4, 1 dan 3 mendapat isyarat Selepas utas 1 melepaskan isyarat, utas 2 mendapat isyarat. Selepas benang 2 dan 3 melepaskan isyarat, benang 5 dan 6 mendapat isyarat.
Atas ialah kandungan terperinci Untuk melaksanakan penyegerakan isyarat dalam kerja kolaboratif berbilang benang Java, anda boleh menggunakan kaedah berikut:. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!