参考:
http://www.importnew.com/15731.html
1.CountDownLatch
[1].让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒
[2].CountDownLatch主要有2个方法
countDown():计数器减一
await():到此处线程阻塞,当计数器变成0后,被唤醒
[3].代码示例
package com.w4xj.interview.thread;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.concurrent.CountDownLatch;
/**
* @Author by w4xj
* @Classname CountDownLatch
* @Description TODO
* @Date 2019/5/7 21:49
* @Created by IDEA
*/
public class CountDownLatchTest {
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.get(i).getCountryName()).start();
}
try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName() + ":秦灭六国~~");
/*
打印:
齐国被灭
楚国被灭
燕国被灭
韩国被灭
魏国被灭
赵国被灭
main:秦灭六国~~
*/
}
}
//安装lombok并引入jar包
@Getter
@AllArgsConstructor
enum CountryEnum{
ONE(1,"齐"),TWO(2,"楚"),THREE(3,"燕"),FOUR(4,"韩"),FIVE(5,"赵"),SIX(6,"魏");
private int countryId;
private String countryName;
public static CountryEnum get(Integer id){
CountryEnum[] values = CountryEnum.values();
for (CountryEnum countryEnum : values()) {
if(countryEnum.getCountryId() == id){
return countryEnum;
}
}
return null;
}
}
2.CyclicBarrier
[1].与CountDownLatch相反,当计数器加到某个值时,继续执行
[2].方法
①.构造方法 public CyclicBarrier(int parties, Runnable barrierAction)
②.await():先到先阻塞
[3].代码
3.Semaphore
[1].信号灯主要用于2个目的,一个是用于多个共享资源的互斥使用,另一个是用于并发线程数的控制
[2].方法
acquire():抢到资源
release():释放资源
[3].代码
package com.w4xj.interview.thread;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
* @Author by w4xj
* @Classname Semaphore
* @Description TODO
* @Date 2019/5/7 22:49
* @Created by IDEA
*/
public class SemaphoreTest {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i = 1 ; i <= 6 ; i++){
new Thread(() ->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "号车抢到车位");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName() + "号车停车1秒,开出车位");
semaphore.release();
}
},String.valueOf(i)).start();
}
/*
打印:
1号车抢到车位
2号车抢到车位
3号车抢到车位
1号车停车1秒,开出车位
4号车抢到车位
2号车停车1秒,开出车位
5号车抢到车位
3号车停车1秒,开出车位
6号车抢到车位
4号车停车1秒,开出车位
5号车停车1秒,开出车位
6号车停车1秒,开出车位
*/
}
}