CyclicBarrier

Posted 12aa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CyclicBarrier相关的知识,希望对你有一定的参考价值。

CyclicBarrier

CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程使用await()方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。CyclicBarrier的另一个构造函数CyclicBarrier(int parties, Runnable barrierAction),用于线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景。

技术图片

 

 结果

技术图片

 

 


 

Semaphore
Semaphore叫信号量,Semaphore有两个目的,第一个是多个共享资源互斥使用,第二个是并发线程数的控制
代码验证
package conclass;

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {
private static Semaphore semaphore = new Semaphore(3);

public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
new Thread(() -> {
if (semaphore.availablePermits() > 0) {
System.out.println(Thread.currentThread().getName() + "终于有茅坑,可以上厕所");
} else {
System.out.println(Thread.currentThread().getName() + "没有茅坑了");
}
try {
System.out.println(Thread.currentThread().getName()+"申请蹲坑");
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "前面得人终于走了,可以安心的上厕所了");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "舒服,上完了~");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}

 


结果


技术图片

 

 

Exchanger

 



原理

 Exchanger是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。因此该工具类的线程对象是成对的。

       Exchanger类提供了两个方法,String exchange(V x):用于交换,启动交换并等待另一个线程调用exchange;String exchange(V x,long timeout,TimeUnit unit):用于交换,启动交换并等待另一个线程调用exchange,并且设置最大等待时间,当等待时间超过timeout便停止等待。

package conclass;

import javax.swing.*;
import java.util.concurrent.Exchanger;

public class ExchangerDemo {
private static String str1 = "资源1";
private static String str2 = "资源2";

private static Exchanger<String> stringexchanger=new Exchanger<>();
public static void main(String[] args) {
//第一个线程
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "初始占用资源1");
try {
String nrestr=stringexchanger.exchange(str1);
System.out.println(Thread.currentThread().getName()+"交换资源"+str1);
}catch (InterruptedException e){
e.printStackTrace();

}
}).start();

//第二线程
new Thread(()-> {
System.out.println(Thread.currentThread().getName() + "初始占用资源1");
try {
String nrestr=stringexchanger.exchange(str2);
System.out.println(Thread.currentThread().getName()+"交换资源"+nrestr);
}catch (InterruptedException e){
e.printStackTrace();

}



}).start();

}
}


结果
技术图片

 


 



 

 

 


 


 


 

 

以上是关于CyclicBarrier的主要内容,如果未能解决你的问题,请参考以下文章

Java并发多线程编程——CyclicBarrier

CyclicBarrier用法

并发工具-CyclicBarrier源码简析

J.U.C并发框架源码阅读CyclicBarrier

Android 的cyclicBarrier

java路障CyclicBarrier