Multi-Threading ist oft ein kollaborativer Vorgang. Beispielsweise sammeln vier Threads vierteljährlich Statistiken zu E-Commerce-Daten. Nachdem die Statistiken abgeschlossen sind, werden sie zusammengefasst. Woher wissen wir, dass alle vier Threads ausgeführt wurden? Wir können die von JDK1.5 bereitgestellten Hilfsklassen CountDownLatch (
Reduce count), CyclicBarrier (zyklische Barriere) und Semaphore (Semaphor) verwenden.
Wie viele kollaborative Threads gibt es, um die CountDownLatch-Konstruktionsparameter zu initialisieren?
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("所有线程任务已经执行完成!"); }
ähnelt dem Reduzieren der Anzahl
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(); } }
# 🎜🎜#
3. Basierend auf der SignaldimensionSemaphor, der Thread und das Signal sind m:n, wobei 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(); } } }
Das obige ist der detaillierte Inhalt vonUm die Signalsynchronisierung in kollaborativen Java-Multithread-Jobs zu implementieren, können Sie die folgenden Methoden verwenden:. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!