欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java多线程Semaphore,多线程semaphore,Semaphore是一个

来源: javaer 分享于  点击 11144 次 点评:45

Java多线程Semaphore,多线程semaphore,Semaphore是一个


Semaphore是一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应的行动。

在一些企业系统中,开发人员经常需要限制未处理的特定资源请求(线程/操作)数量,事实上,限制有时候能够提高系统的吞吐量,因为它们减少了对特定资源的争用。尽管完全可以手动编写限制代码,但使用 Semaphore类可以更轻松地完成此任务,它将帮您执行限制。

import java.util.Random;import java.util.concurrent.Semaphore;public class SemaphoreApp {    public static void main(String[] args) {        Runnable limitedCall = new Runnable() {            final Random rand = new Random();            final Semaphore available = new Semaphore(3);            int count = 0;            public void run() {                int time = rand.nextInt(15);                int num = count++;                try {                    available.acquire();                    System.out.println("Executing " + "long-running action for " + time + " seconds... #" + num);                    Thread.sleep(time * 1000);                    System.out.println("Done with #" + num + "!");                    available.release();                } catch (InterruptedException intEx) {                    intEx.printStackTrace();                }            }        };        for (int i = 0; i < 10; i++)            new Thread(limitedCall).start();    }}

即使本例中的 10 个线程都在运行,可以对运行SemaphoreApp的Java进程执行jstack来验证,只有3个线程是活跃的。在一个信号计数器释放之前,其他7个线程都处于空闲状态。

相关栏目:

用户点评