package com.endual;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Exchanger;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class SemaphoneMain {
//semaphone可以维护当前访问自身的线程的个数,并且提供了同步机制。
//使用semaphone可以控制同时访问资源的线程个数。例如,实现一个文件的并发访问数。
//semaphore 实现的功能就类似测试的五个坑,例如有十个人要上测试,那么同时有多少
//个人要上厕所呢?只能同时有5个人来占用,当5个人用用后,空出来的,就有人再进去用
Semaphore sp = new Semaphore(3) ;
private int parties = 1;
//表示大家彼此等待,大家集合号才开始出发,分散活动后又在指定地点碰面,这就好比整个公司的
//的人员利用周末时间集体郊游一样,先各自从自家出发到公司后,在同时出发到公园游玩,
//再指定地点集合好以后再同时开始就餐
CyclicBarrier cb = new CyclicBarrier(parties ) ; //同步工具类
private int count = 20 ;
//犹如倒计时器,调用这个多谢的countdown方法就将计时器减去一,当计时器为0是做所有等待的线程
//就立马自己开始运行
CountDownLatch cdlx = new CountDownLatch(count ) ;
//用于两个人之间实现的数据交换,每个人在完成一定的事物以后就想着和对方交换数据
//第一个人先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据
Exchanger exch = new Exchanger() ;
public void testAyclicBarrier() throws Exception, BrokenBarrierException {
CountDownLatch cdlx = new CountDownLatch(count ) ;
cb.await() ;
cb.getNumberWaiting() ;
cb.isBroken() ;
cdlx.countDown() ; //减去一
cdlx.getCount() ;
cdlx.await() ;//当家都等待着
exch.wait() ;
Object x = null;
exch.exchange(x) ; //该线程和object进行数据交换 ??
TimeUnit unit = null;
long timeout;
//exch.exchange(x, timeout, unit) ;
int capacity = 1;
//可阻塞队列用来同步
ArrayBlockingQueue<String> abkq = new ArrayBlockingQueue<String>(capacity);
String e = "name";
abkq.add(e ) ;
abkq.put(e) ;
}
public void main() {
try {
sp.acquire() ;
// sp.isFair() = true ;
// sp.isFair() = false ;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sp.release() ;
}
}
java并发访问的几个工具类的简单说明
最新推荐文章于 2024-10-05 22:51:28 发布