JDK CyclicBarrier浅析

本文通过一个具体的Java多线程示例,演示了如何使用CyclicBarrier来同步多个线程,确保所有线程完成任务后再执行后续操作,解决了线程间的同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还是看一段代码,下边输出什么?

package com.test.java;

class MyThread3 implements Runnable{

	String name;
	
	public MyThread3(){}
	
	public MyThread3(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		 for (int i = 0; i < 7; i++) {
			System.out.println(name+"正在做第"+(i+1)+"个俯卧撑。");
		 }
	}
	
}
public class TestConcurrent3 {
    public static void main(String[] args) {
		Thread kaka = new Thread(new MyThread3("卡卡"));
		kaka.start();
		
		Thread beckham = new Thread(new MyThread3("小贝"));
		beckham.start();
		
		Thread owen = new Thread(new MyThread3("欧文"));
		owen.start();
		
		System.out.println("guys, good job!");
	}
}


很遗憾,输出是各种无序,本来期待"guys, good job!"在最后一行,但是却发现输出是整个乱的,像这样...

 

这个时候就是CyclicBarrier的大展身手的时候了。

CyclicBarrier是一个同步辅助类,允许一组线程相互等待,直到到达一个共同的barrier point。如果一组线程需要不定时地相互等待,这个时候就可以用到CyclicBarrier。CyclicBarrier之所以带“Cyclic”前缀,是因为当所有相互等待的线程释放后,Barrier可以被重复利用。

改造一下代码...

package com.test.java;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

class MyThread3 implements Runnable{

	String name;
	
	CyclicBarrier cyclic;
	
	public MyThread3(){}
 
	public MyThread3(String name) {
		this.name = name;
	}

	public MyThread3(String name, CyclicBarrier cyclic) {
		this.name = name;
		this.cyclic = cyclic;
	}

	@Override
	public void run() {
		 for (int i = 0; i < 7; i++) {
			System.out.println(name+"正在做第"+(i+1)+"个俯卧撑。");
		 }
		 try {
			cyclic.await();
		 } catch (InterruptedException e) {
			e.printStackTrace();
		 } catch (BrokenBarrierException e) {
			e.printStackTrace();
		 }
	}
	
}

class MyThread3_barrierAction implements Runnable{

	@Override
	public void run() {
		System.out.println("guys, good job!");
	}
	
}

public class TestConcurrent3 {
    public static void main(String[] args) {
    	CyclicBarrier cyclic = new CyclicBarrier(4, new MyThread3_barrierAction());
        
		Thread kaka = new Thread(new MyThread3("卡卡", cyclic));
		kaka.start();
		
		Thread beckham = new Thread(new MyThread3("小贝", cyclic));
		beckham.start();
		
		Thread owen = new Thread(new MyThread3("欧文", cyclic));
		owen.start();
		
    	try {
			cyclic.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
	}
}










但是总觉得代码好像少了什么东西  .. ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值