学习java多线程,请同事参阅:java多线程CountDownLatch简单测试
Semaphore 信号量的主要应用场景是控制最多N个线程同时地访问资源,其中计数器的最大值即是许可的最大值N。
CyclicBarrier可循环使用(Cyclic)的屏障(Barrier),它可以实现让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,所有被屏障拦截的线程才会继续执行。
测试代码如下:
public class ThreadsTest implements Runnable{
private ExecutorService threadPool=Executors.newFixedThreadPool(10);
private CyclicBarrier cb=new CyclicBarrier(10,this);
private ConcurrentHashMap map=new ConcurrentHashMap();
// 只能2个线程同时访问
final Semaphore semp = new Semaphore(2);
public void count(){
for(int i=0;i<10;i++){
threadPool.execute(new Runnable(){
@Override
public void run() {
// 获取许可
try {
semp.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int j=0; j<6;j++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("--------j----threadName-----" + j + "====" + Thread.currentThread().getName());
}
int score=(int)(Math.random()*35+60);
map.put(Thread.currentThread().getName(), score);
System.out.println(Thread.currentThread().getName()+"的平均成绩为"+score);
try {
// 访问完后,释放
semp.release();
cb.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
}
@Override
public void run() {
int result=0;
Set set = map.keySet();
for(String s:set){
result+=map.get(s);
}
System.out.println("平均成绩为:"+(result/10)+"分");
}
public static void main(String[] args) {
ThreadsTest t=new ThreadsTest();
t.count();
}
}
执行结果如下:
--------j----threadName-----0====pool-1-thread-1
--------j----threadName-----0====pool-1-thread-2
--------j----threadName-----1====pool-1-thread-2
--------j----threadName-----1====pool-1-thread-1
--------j----threadName-----2====pool-1-thread-2
--------j----threadName-----2====pool-1-thread-1
--------j----threadName-----3====pool-1-thread-2
--------j----threadName-----3====pool-1-thread-1
--------j----threadName-----4====pool-1-thread-2
--------j----threadName-----4====pool-1-thread-1
--------j----threadName-----5====pool-1-thread-2
--------j----threadName-----5====pool-1-thread-1
pool-1-thread-1的平均成绩为80
pool-1-thread-2的平均成绩为80
--------j----threadName-----0====pool-1-thread-3
--------j----threadName-----0====pool-1-thread-4
--------j----threadName-----1====pool-1-thread-3
--------j----threadName-----1====pool-1-thread-4
--------j----threadName-----2====pool-1-thread-4
--------j----threadName-----2====pool-1-thread-3
--------j----threadName-----3====pool-1-thread-3
--------j----threadName-----3====pool-1-thread-4
--------j----threadName-----4====pool-1-thread-4
--------j----threadName-----4====pool-1-thread-3
--------j----threadName-----5====pool-1-thread-3
pool-1-thread-3的平均成绩为74
--------j----threadName-----5====pool-1-thread-4
pool-1-thread-4的平均成绩为86
--------j----threadName-----0====pool-1-thread-5
--------j----threadName-----0====pool-1-thread-6
--------j----threadName-----1====pool-1-thread-5
--------j----threadName-----1====pool-1-thread-6
--------j----threadName-----2====pool-1-thread-5
--------j----threadName-----2====pool-1-thread-6
--------j----threadName-----3====pool-1-thread-6
--------j----threadName-----3====pool-1-thread-5
--------j----threadName-----4====pool-1-thread-5
--------j----threadName-----4====pool-1-thread-6
--------j----threadName-----5====pool-1-thread-5
pool-1-thread-5的平均成绩为72
--------j----threadName-----5====pool-1-thread-6
pool-1-thread-6的平均成绩为61
--------j----threadName-----0====pool-1-thread-7
--------j----threadName-----0====pool-1-thread-8
--------j----threadName-----1====pool-1-thread-7
--------j----threadName-----1====pool-1-thread-8
--------j----threadName-----2====pool-1-thread-8
--------j----threadName-----2====pool-1-thread-7
--------j----threadName-----3====pool-1-thread-8
--------j----threadName-----3====pool-1-thread-7
--------j----threadName-----4====pool-1-thread-8
--------j----threadName-----4====pool-1-thread-7
--------j----threadName-----5====pool-1-thread-8
--------j----threadName-----5====pool-1-thread-7
pool-1-thread-8的平均成绩为89
pool-1-thread-7的平均成绩为61
--------j----threadName-----0====pool-1-thread-9
--------j----threadName-----0====pool-1-thread-10
--------j----threadName-----1====pool-1-thread-10
--------j----threadName-----1====pool-1-thread-9
--------j----threadName-----2====pool-1-thread-9
--------j----threadName-----2====pool-1-thread-10
--------j----threadName-----3====pool-1-thread-9
--------j----threadName-----3====pool-1-thread-10
--------j----threadName-----4====pool-1-thread-10
--------j----threadName-----4====pool-1-thread-9
--------j----threadName-----5====pool-1-thread-10
--------j----threadName-----5====pool-1-thread-9
pool-1-thread-9的平均成绩为93
pool-1-thread-10的平均成绩为90
平均成绩为:78分