• Java多线程 信号量和屏障实现控制并发线程数量,主线程等待所有线程执行完毕


    学习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分

  • 相关阅读:
    【天梯赛 - L2习题集】啃题(6 / 44)
    基于ssm的旅游管理系统
    Dubbo入门案例
    LeetCode每日一题(212. Word Search II)
    hiberate实体类CURD、事务操作汇总
    计算机毕业设计——简单的网页设计
    2022年上半年系统分析师上午真题及答案解析
    JS构造函数与class类中的封装、继承和多态
    C# Onnx Yolov8 Detect 涉黄检测
    为什么女性应该考虑从事网络安全事业?
  • 原文地址:https://blog.csdn.net/u013558123/article/details/127714858