标签:public 对象 read hang wait stat for imp oid
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();
}
}
结果
标签:public 对象 read hang wait stat for imp oid
原文地址:https://www.cnblogs.com/12aa/p/12528407.html