并发同步器:CountDownLatch,CyclicBarrierDemo,SemaphoreDemo

CountDownLatch(减法器)

含义:减法;为0了才继续

让一些线程阻塞直到另- -些线程完成- -系列操作后才被唤醒

CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞。
其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),
当计数器的值变为零时,因调用await方 法被阻塞的线程会被唤醒,继续执行。

在这里插入图片描述

两个重要的方法:

latch.countDown();数量减1,如果当前计数等于零,那么没有任何反应。释放所有等待的线程。
latch.await();计数到零执行下一步

使用(测试):

package InterviewTest;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {
	public static void main(String[] args) {
		CountDownLatch countDownLatch = new CountDownLatch(6);
		
		for(int i=1;i<=6;i++) {
			new Thread(()->{
				System.out.println(Thread.currentThread().getName()+"  国被灭");
				countDownLatch.countDown();
			},CountryEnum.forEach_CountryEnum(i).getRetMessage()).start();
		}
		try {
			countDownLatch.await();		//必须等到所有线程完毕(6到0),主线程才能继续
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"  ****大秦帝国一统天下");
		
		System.out.println();
		System.out.println(CountryEnum.ONE);
		System.out.println(CountryEnum.ONE.getRetCode());
		System.out.println(CountryEnum.ONE.getRetMessage());
	}
	
}
枚举类:
package InterviewTest;

public enum CountryEnum {
	ONE(1,"齐"),TWO(2,"楚"),THREE(3,"燕"),FOUR(4,"赵"),FIVE(5,"魏"),SIX(6,"韩");
	
	
	private Integer retCode;
	private String retMessage;
	
	
	public Integer getRetCode() {
		return retCode;
	}
	public void setRetCode(Integer retCode) {
		this.retCode = retCode;
	}
	public String getRetMessage() {
		return retMessage;
	}
	public void setRetMessage(String retMessage) {
		this.retMessage = retMessage;
	}
	
	 CountryEnum(Integer retCode,String retMessage) {
		this.retCode=retCode;
		this.retMessage = retMessage;
	}
	public static CountryEnum forEach_CountryEnum(int index) {
		CountryEnum[] myArray = CountryEnum.values();
		for(CountryEnum element:myArray) {
			if(index==element.getRetCode()) {
				return element;
			}
		}
		return null;
	}
	
}

CyclicBarrier(加法器)

含义:加法,到达规定数值才继续

CyclicBarrier的字面意思是可循环(Cyclic) 使用的屏障(Barrier) 。它要做的事情是,
让一组线程到达-一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,
屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。

在这里插入图片描述

使用(测试):

package InterviewTest;

import java.util.concurrent.CyclicBarrier;

public class CyclicBarierDemo {
	
	public static void main(String[] args) {
		CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
			System.out.println("****召唤神龙");
		});
		for(int i=1;i<=7;i++) {
			final int tempInt = i;
			new Thread(()->{
				System.out.println(Thread.currentThread().getName()+"   收集到:"
						+tempInt+"星龙珠");
				try {
					cyclicBarrier.await();
				} catch (Exception e) {
					e.printStackTrace();
				}	
			},String.valueOf(i)).start();
		}
		/*直接写输出的话,不会在全部收集齐了才召唤*/
//		System.out.println("****召唤神龙");
	}
}

SemaphoreDemo(信号量)

含义:

信号量表示一种公共的共享资源,信号量的数值如果是整数,那么就表示该资源当前剩余可供使用的数量;如果信号量是负数,那么就表示目前正有信号量数值的绝对值个线程正在等待使用。在操作系统中,信号量的占用和释放是通过P,V操作来进行,这两个操作是一对原语,即一旦发生就不能能被打断。
转载:引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值