一、Semaphore的作用:限流(并发操作中如果只支持十个并发,就可以用Semaphore进行操作,其余线程都会回阻塞,只有当semaphore中的线程释放令牌其他线程才允许进入)
package com.gpdi.security;
import java.util.concurrent.Semaphore;
/**
*
* @description:多线程操作的工具类
*
* 单机版的限流工具
*
*/
public class SemaphoreDemo {
static class Car extends Thread {
private int number;
private Semaphore semaphore;
public Car(int number, Semaphore semaphore) {
this.number = number;
this.semaphore = semaphore;
}
@Override
public void run() {
try {
semaphore.acquire();//获取一个令牌,如果拿不到就会阻塞
System.out.println("抢占第" + number + "个车位");
Thread.sleep(1000);
System.out.println("第" + number + "个车开走了");
semaphore.release();//令牌释放
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(10);
for (int i = 0; i < 100; i++) {
new Car(i, semaphore).start();
}
}
}
二、栅栏工具CyclicBarrier
作用:可以让一组线程到达某一种状态后才进行接下来的操作
package com.gupaoedu;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Main {
static String finalName = "";
public static void main(String[] args) {
Main main = new Main();
main.main1();
}
public void main1() {
CyclicBarrier c = new CyclicBarrier(2, new AnzData());
new Thread(new DataImport1(c, "name1")).start();
new Thread(new DataImport2(c, "name2")).start();
}
public class AnzData extends Thread {
@Override
public void run() {
System.out.println("进行最终的数据分析" + finalName);
}
}
public class DataImport1 extends Thread {
private CyclicBarrier cyclicBarrier;
private String name;
public DataImport1(CyclicBarrier cyclicBarrier, String name) {
this.cyclicBarrier = cyclicBarrier;
this.name = name;
}
@Override
public void run() {
try {
System.out.println("开始导入数据1");
finalName += name;
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
public class DataImport2 extends Thread {
private CyclicBarrier cyclicBarrier;
private String name;
public DataImport2(CyclicBarrier cyclicBarrier, String name) {
this.cyclicBarrier = cyclicBarrier;
this.name = name;
}
@Override
public void run() {
try {
finalName += name;
System.out.println("开始导入数据2");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}