zoukankan      html  css  js  c++  java
  • 如何控制某个方法允许并发访问线程的个数

    import java.util.concurrent.Semaphore;
    
    /**
     * 如何控制某个方法允许并发访问线程的个数
     * permits the initial number of permits available. This value may be negative,
     * in which case releases must occur before any acquires will be granted.
     * fair true if this semaphore will guarantee first-in first-out granting of
     * permits under contention, else false
     */
    public class SemaphoreTest {
        static Semaphore semaphore = new Semaphore(5, true);
    
        public static void main(String[] args) {
            for (int i = 0; i < 100; i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        test();
                    }
                }).start();
            }
        }
    
        public static void test() {
            try {
                //申请一个新的请求
                semaphore.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"进来了");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"走了");
            //释放一个请求
            semaphore.release();
        }
    }

    运行结果如下:

      

    Thread-0进来了
    Thread-1进来了
    Thread-4进来了
    Thread-2进来了
    Thread-3进来了
    Thread-0走了
    Thread-1走了
    Thread-6进来了
    Thread-4走了
    Thread-5进来了
    Thread-9进来了
    Thread-2走了
    Thread-8进来了
    Thread-3走了
    Thread-7进来了
    Thread-5走了
    Thread-6走了
    Thread-9走了
    Thread-8走了
    Thread-10进来了
    Thread-11进来了
    Thread-12进来了
    Thread-13进来了
    Thread-7走了
    Thread-14进来了
    Thread-11走了
    Thread-13走了
    Thread-15进来了
    Thread-12走了
    Thread-17进来了
    Thread-10走了
    Thread-16进来了
    Thread-18进来了
    Thread-14走了
    Thread-19进来了
    Thread-15走了
    Thread-16走了
    Thread-20进来了
    Thread-17走了
    Thread-18走了
    Thread-22进来了
    Thread-21进来了
    Thread-23进来了
    Thread-19走了
    Thread-24进来了
    Thread-23走了
    Thread-21走了
    Thread-25进来了
    Thread-22走了
    Thread-20走了
    Thread-27进来了
    Thread-26进来了
    Thread-28进来了
    Thread-24走了
    Thread-29进来了
    Thread-25走了
    Thread-27走了
    Thread-26走了
    Thread-28走了
    Thread-32进来了
    Thread-31进来了
    Thread-30进来了
    Thread-33进来了
    Thread-29走了
    Thread-34进来了
    Thread-31走了
    Thread-30走了
    Thread-33走了
    Thread-32走了
    Thread-37进来了
    Thread-36进来了
    Thread-35进来了
    Thread-38进来了
    Thread-34走了
    Thread-39进来了
    Thread-37走了
    Thread-36走了
    Thread-35走了
    Thread-38走了
    Thread-42进来了
    Thread-41进来了
    Thread-40进来了
    Thread-43进来了
    Thread-39走了
    Thread-44进来了
    Thread-41走了
    Thread-40走了
    Thread-42走了
    Thread-43走了
    Thread-47进来了
    Thread-46进来了
    Thread-45进来了
    Thread-48进来了
    Thread-44走了
    Thread-49进来了
    Thread-46走了
    Thread-48走了
    Thread-47走了
    Thread-51进来了
    Thread-45走了
    Thread-52进来了
    Thread-50进来了
    Thread-53进来了
    Thread-49走了
    Thread-54进来了
    Thread-53走了
    Thread-50走了
    Thread-55进来了
    Thread-51走了
    Thread-52走了
    Thread-57进来了
    Thread-56进来了
    Thread-58进来了
    Thread-54走了
    Thread-59进来了
    Thread-57走了
    Thread-56走了
    Thread-58走了
    Thread-55走了
    Thread-62进来了
    Thread-61进来了
    Thread-60进来了
    Thread-63进来了
    Thread-59走了
    Thread-64进来了
    Thread-63走了
    Thread-60走了
    Thread-61走了
    Thread-62走了
    Thread-67进来了
    Thread-66进来了
    Thread-65进来了
    Thread-68进来了
    Thread-64走了
    Thread-69进来了
    Thread-68走了
    Thread-67走了
    Thread-66走了
    Thread-71进来了
    Thread-65走了
    Thread-72进来了
    Thread-73进来了
    Thread-70进来了
    Thread-69走了
    Thread-74进来了
    Thread-73走了
    Thread-72走了
    Thread-75进来了
    Thread-70走了
    Thread-71走了
    Thread-77进来了
    Thread-76进来了
    Thread-78进来了
    Thread-74走了
    Thread-79进来了
    Thread-78走了
    Thread-75走了
    Thread-76走了
    Thread-81进来了
    Thread-77走了
    Thread-82进来了
    Thread-80进来了
    Thread-83进来了
    Thread-79走了
    Thread-84进来了
    Thread-81走了
    Thread-83走了
    Thread-85进来了
    Thread-80走了
    Thread-82走了
    Thread-87进来了
    Thread-86进来了
    Thread-88进来了
    Thread-84走了
    Thread-89进来了
    Thread-87走了
    Thread-85走了
    Thread-86走了
    Thread-88走了
    Thread-92进来了
    Thread-91进来了
    Thread-93进来了
    Thread-90进来了
    Thread-89走了
    Thread-94进来了
    Thread-93走了
    Thread-90走了
    Thread-96进来了
    Thread-92走了
    Thread-91走了
    Thread-97进来了
    Thread-98进来了
    Thread-95进来了
    Thread-94走了
    Thread-99进来了
    Thread-98走了
    Thread-95走了
    Thread-96走了
    Thread-97走了
    Thread-99走了

      可以使用Semaphore控制,首先(构造函数)创建了一个Semaphore对象,并且初始化了5个信号。这样的效果是空间test方法最多只能有5个线程并发访问,对于5个线程时就排队等待,走一个来下一个,请求一个信号(消费一个信号),如果信号被用完了则等待,如果信号被用完了则等待,等待释放一个信号,释放的信号新的线程就可以使用了。

  • 相关阅读:
    java多线程api
    java多线程
    java代理
    java程序员常用的linux命令
    java泛型
    java反射
    日期和时间
    java集合
    Nodejs mac版安装
    for in、each; for 、forEach、map
  • 原文地址:https://www.cnblogs.com/scar1et/p/11900492.html
Copyright © 2011-2022 走看看