JUC的使用
1、juc是什么
juc一般是指jdk中java.util .concurrent工具包
2、如何使用juc
2、1CountDownLatch
countDown():计数器减一
await():计数器停止,唤醒其他线程
public class Test {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(50);
new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println("+++++++++++++++++++++++++Thread");
countDownLatch.countDown();
}
}).start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 100; i++) {
System.out.println("main-------------------------");
}
}
}
2、2CyclicBarrier
加法计数器
public class Test1 {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(30, ()->{
System.out.println("放行");
});
for (int i = 0; i < 90; i++) {
final int temp = i;
new Thread(()->{
//lambda表达式中只能访问final修饰的变量
System.out.println("-->" + temp);
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
CyclicBarrier只能够唤醒一个任务,CountDownLatch可以唤起多个任务。
CyclicBarrier可以重置,重新使用,但是CountDownLatch的值等于0时,就不可重复用了。
2、3Semaphore
计数信号量,实现限流操作,限制可以访问某些资源的线程数量。
Semaphore 只有 3 个操作
- 初始化
- 获得许可
- 释放
public class Test2 {
public static void main(String[] args) {
//初始化
Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 15; i++) {
new Thread(() -> {
try {
//获得许可
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "进店购物");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName() + "出店");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//释放
semaphore.release();
}
}, String.valueOf(i)).start();
}
}
}