并发同步器
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操作来进行,这两个操作是一对原语,即一旦发生就不能能被打断。
转载:引用