java多线程JUC常用辅助类详解

网友投稿 247 2022-09-24


java多线程JUC常用辅助类详解

1.countDownLatch

减法计数器:实现调用几次线程后,在触发另一个任务

简单代码实现:

举例说明:就像五个人在同一房间里,有一个看门的大爷,当五个人都出去后,他才能锁门,也就是说 执行5次出门这个动作的线程后,才出发了锁门的这个动作

import java.util.concurrent.CountDownLatch;http://

/**

* @program: juc

* @description

* @author: 不会编程的派大星

* @create: 2021-04-24 16:55

**/

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;

/**

* @program: juc

* @description

* @author: 不会编程的派大星

* @create: 2021-04-24 17:31

**/

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;

/**

* @program: juc

* @description

* @author: 不会编程的派大星

* @create: 2021-04-24 17:31

**/

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;

/**

* @program: juc

* @description

* @author: 不会编程的派大星

* @create: 2021-04-24 18:26

**/

public class SemaphoreXxtkmTaZEGTest {

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辅助类的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:GNS3静态路由配置(gns3怎么配置静态路由)
下一篇:静态路由!静态路由!静态路由!原理与配置(静态路由的)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~