java多线程JUC常用辅助类详解
1.countDownLatch
减法计数器:实现调用几次线程后,在触发另一个任务
简单代码实现:
举例说明:就像五个人在同一房间里,有一个看门的大爷,当五个人都出去后,他才能锁门,也就是说 执行5次出门这个动作的线程后,才出发了锁门的这个动作
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
System.out.println("door is open");
for (int i = 1; i <= 5 ; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+" is going out");
countDownLatch.countDown();
},String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println("door is closed");
}
}
代码运行结果:
基本原理:
countDownLatch.countDown(); // 数量-1
countDownLatch.await(); // 等待计数器归零,然后再向下执行
每次有线程调用 countDown() 数量-1,假设计数器变为0,countDownLatch.await() 就会被唤醒,继续执行!
2.CyclicBarrier
这里我们简单理解为 加法计数器
简单代码实现:
举例说明:这里只要集齐7颗龙珠,就执行 打印 “7颗龙珠集齐了”的线程,这里我们先设置线程计数为8,看看会不会执行打印的线程,然后在执行计数为7的情况
1.cyclicBarrier计数为8的时候,执行线程数量为7的时候:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(8,new myThread());
for (int i = 1; i <= 7 ; i++) {
int finalI = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+"收集了"+ finalI+"颗龙珠");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
class myThread implements Runnable{
@Override
public void run() {
System.out.println("7颗龙珠集齐啦");
}
}
执行结果:
2.cyclicBarrier计数为1的时候,执行线程数量为7的时候:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,new myThread());
for (int i = 1; i <= 7 ; i++) {
int finalI = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+"收集了"+ finalI+"颗龙珠");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
class myThread implements Runnable{
@Override
public void run() {
System.out.println("7颗龙珠集齐啦");
}
}
执行结果:
可以看到
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,new myThread());
当执行完7个线程后,才会执行一个实现了Runnable接口的线程
3.Semaphore
简单代码实现:
举例说明:抢车位 ,6个车,最多同时只能有三个车进
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class SemaphoreTest {
public static void main(String[] args) {
//线程数量 ,停车位,,6辆车在等,最多只能同时进来三个 限流
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 6 ; i++) {
new Thread(() -> {
try {
semaphore.acquire();//获得
System.out.println(Thread.currentThread().getName()+"抢到车位了");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"离开车位了");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); //释放
}
},String.valueOf(i)).start();
}
}
}
运行结果:
原理说明:
semaphore.acquire()
; 获得,假设如果已经满了,等待,等待被释放为止!
semaphore.release()
; 释放,会将当前的信号量释放 + 1,然后唤醒等待的线程!
作用: 多个共享资源互斥的使用!并发限流,控制最大的线程数!
以上就是java多线程JUC常用辅助类详解的详细内容,更多关于java多线程JUC辅助类的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341