Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。今天我们就学习一下Semaphore的用法。

java中多线程Semaphore的使用

关于Semaphore常用的方法的介绍

// 从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。
acquire():Acquires a permit from this semaphore, blocking until one is available, or the thread is interrupted.
// 释放一个许可,将其返回给信号量。
release() :Releases a permit, returning it to the semaphore.

一、Semaphore的简单使用

public class SemaphoreTest {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
final Semaphore availableWindow = new Semaphore(5);
int count = 1;
@Override
public void run() {
int time = (int) (Math.random() * 10 + 3);
int num = count++;
try {
availableWindow.acquire();
System.out.println("正在为第【" + num + "】个客户办理业务,需要时间:" + time + "s!");
Thread.sleep(time * 1000);
if (availableWindow.hasQueuedThreads()) {
System.out.println("第【" + num + "】个客户已办理完业务,有请下一位!");
} else {
System.out.println("第【" + num + "】个客户已办理完业务,没有客户了,休息中!");
}
availableWindow.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}; // 循环10次
for (int i = 1; i < 10; i++) {
new Thread(runnable).start();
}
}
}

运行的结果如下:每次运行的结果是不一样的

正在为第【】个客户办理业务,需要时间:3s!
正在为第【】个客户办理业务,需要时间:12s!
正在为第【】个客户办理业务,需要时间:10s!
正在为第【】个客户办理业务,需要时间:7s!
正在为第【】个客户办理业务,需要时间:3s!
第【】个客户已办理完业务,有请下一位!
正在为第【】个客户办理业务,需要时间:11s!
第【】个客户已办理完业务,有请下一位!
正在为第【】个客户办理业务,需要时间:6s!
第【】个客户已办理完业务,有请下一位!
正在为第【】个客户办理业务,需要时间:10s!
第【】个客户已办理完业务,有请下一位!
正在为第【】个客户办理业务,需要时间:12s!
第【】个客户已办理完业务,没有客户了,休息中!
第【】个客户已办理完业务,没有客户了,休息中!
第【】个客户已办理完业务,没有客户了,休息中!
第【】个客户已办理完业务,没有客户了,休息中!
第【】个客户已办理完业务,没有客户了,休息中!

二、Semaphore可以当成mutual exclusion lock使用

A semaphore initialized to one, and which is used such that it only has at most one permit available, can serve as a mutual exclusion lock.

package com.linux.huhx.concurreny;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class SemaphoreTest1 {
public static void main(String[] args) {
final BusinessTask task = new BusinessTask();
ExecutorService service = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
service.execute(task);
}
service.shutdown();
} private static class BusinessTask implements Runnable {
private int count;
Lock lock = new ReentrantLock();
Semaphore semaphore = new Semaphore(1); @Override
public void run() {
try {
// semaphore.acquire();
lock.lock();
count ++;
Thread.sleep(1000);
System.out.println(count);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// semaphore.release();
lock.unlock();
}
}
}
}

运行的结果固定如下:


友情链接

java高级---->Thread之Semaphore的使用的更多相关文章

  1. java高级之信号灯Semaphore

    1.Semaphore概念 Semaphore是Java1.5之后提供的一种同步工具,Semaphore可以维护访问自身线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数 ...

  2. java高级---->Thread之ScheduledExecutorService的使用

    ScheduledExecutorService的主要作用就是可以将定时任务与线程池功能结合使用.今天我们来学习一下ScheduledExecutorService的用法.我们都太渺小了,那么容易便湮 ...

  3. java高级---->Thread之ExecutorService的使用

    今天我们通过实例来学习一下ExecutorService的用法.我徒然学会了抗拒热闹,却还来不及透悟真正的冷清. ExecutorService的简单实例 一.ExecutorService的简单使用 ...

  4. java高级---->Thread之Phaser的使用

    Phaser提供了动态增parties计数,这点比CyclicBarrier类操作parties更加方便.它是jdk1.7新增的类,今天我们就来学习一下它的用法.尘埃落定之后,回忆别来挑拨. Phas ...

  5. java高级---->Thread之CompletionService的使用

    CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理.今天我们通过实例来学习一下CompletionServi ...

  6. java高级---->Thread之CyclicBarrier的使用

    CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).今天我们就学习一下CyclicBarrier的用法. Cycl ...

  7. java高级---->Thread之BlockingQueue的使用

    今天我们通过实例来学习一下BlockingQueue的用法.梦想,可以天花乱坠,理想,是我们一步一个脚印踩出来的坎坷道路. BlockingQueue的实例 官方文档上的对于BlockingQueue ...

  8. java高级---->Thread之Exchanger的使用

    Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.今天我们就通过实例来学习一下Exchanger的用法. Exchanger的简单实例 Exchanger是 ...

  9. java高级---->Thread之FutureTask的使用

    FutureTask类是Future 的一个实现,并实现了Runnable,所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行.今天我们通过实例来学习一下FutureTask的 ...

随机推荐

  1. C语言 · 芯片测试

    基础练习 芯片测试   时间限制:1.0s   内存限制:512.0MB    问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多. 每个芯片都能用来测试其他芯片.用好芯片测试其他芯 ...

  2. websocket 初步使用经验(python)

    想实现网页前端和后端的数据同步交互,就有必要使用 websocket 的方式进行通信. python websocket github 地址:git@github.com:Aplexchenfl/py ...

  3. import_tasks: tasks/sometasks.yml

    - import_tasks: tasks/sometasks.yml  when: "'reticulating splines' in output" unarchive模块用 ...

  4. A/libc:fatal signal 11(SIGSEGV).code 1, fault addr 0x0 in tid 26488 (VideoEncoder)

    在调试Camera模块:发现相同的代码在厂家提供的环境里边编译.就是ok的,在我们的源码树中编译,将HAL库推进去后.就会signal 11退出. 一.现象 F/libc ( ): Fatal sig ...

  5. 写给测试人员:不是所有的bug都需要修复

    用户往往对产品中各种各样的bug抱怨不已,而测试人员往往认为自己的职责就是揪出这些所有的bug并把它们全都修复.然而,这是一个误区.微软卓越测试工程总监Alan Page近日撰文,再次解释了有哪些bu ...

  6. Windoows窗口程序二

    WNDCLASS属性style取值: CS_GLOBALCLASS--应用程序全局窗口类 CS_BYTEALIGNCLIENT--窗口客户区的水平位置8倍数对齐 CS_BYTEALIGNWINDOW- ...

  7. WCF(一)

    摘自:http://www.cnblogs.com/yank/p/3653160.html WCF入门教程(一)简介 1.WCF是什么? WCF( Windows Communication Foun ...

  8. 关于Cocos2d-x中UI按钮的定义

    1.要有两张不同状态的图片 2.定义一个MenuItemSprite的实例,把这两张图的Sprite实例放进MenuItemSprite的实例 3.把MenuItemSprite的实例放进Menu实例 ...

  9. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  10. 【Java集合的详细研究6】Java 数组

    Java 语言中提供的数组是用来存储固定大小的同类型元素. 声明数组变量 double[] myList; // 首选的方法 或 double myList[]; // 效果相同,但不是首选方法 创建 ...