学习多线程5---Semaphore

Semaphore用于保证至多只有确定X条线程同时执行,系统在它们之间进行切换

下面是一个使用例子

package com.condition;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreTest {

	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newCachedThreadPool();
		final Semaphore semaphore = new Semaphore(4);
		for(int i = 0;i < 10;i++){
			Runnable runnable = new Runnable(){

				    @Override
					public void run() {
						try {
							semaphore.acquire();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("*"+Thread.currentThread().getName()
								+" is into "+semaphore.availablePermits());
						try {
							Thread.sleep((long) (Math.random()*10000));
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						System.out.println("*"+Thread.currentThread().getName()
							+" is leaving ");
						semaphore.release();
					}
			 };
			 threadPool.execute(runnable);
		}
	}

}

  

时间: 2024-12-08 16:44:02

学习多线程5---Semaphore的相关文章

Swift 学习-多线程

1:第一种多线程 func fun1(){ for i in 200...300{ NSLog("%d",i); } } func fun2(){ for i in 300...400{ NSLog("%d",i); } } var th1 = NSThread(target:self,selector:"fun1",object:nil); th1.start(); //开启线程 NSThread.detachNewThreadSelector

Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过start方法启动线程--->线程变为可运行可执行状态,然后通过数据产生共享,线程产生互斥---->线程状态变为阻塞状态---->阻塞状态想打开的话可以调用notify方法. 这里Java5中提供了封装好的类,可以直接调用然后构造阻塞状态,以保证数据的原子性. 2.如何实现? 主要是实现Blo

Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是CountDownLatch? 倒计时计数器,调用CountDownLatch对象的CountDown()方法就将计数器减一,当计数到达0时,则所有等待者或者全部等待者开始执行. 2.如何用? new CountDownLatch(1); 直接new,其构造函数必须传一个int类型的参数,参数的意思是: c

多线程基础必要知识点!看了学习多线程事半功倍

前言 不小心就鸽了几天没有更新了,这个星期回家咯.在学校的日子要努力一点才行! 只有光头才能变强 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 本文章的知识主要参考<Java并发编程实战>这本书的前4章,这本书的前4章都是讲解并发的基础的.要是能好好理解这些基础,那么我们往后的学习就会事半功倍. 当然了,<Java并发编程实战>可以说是非常经典的一本书.我是未能完全理解的,在这也仅仅是抛砖引玉.想要更加全面地理解我下面所说的知识点,可以去阅读一下这本书,总的来说还

java并发编程学习:用 Semaphore (信号量)控制并发资源

并发编程这方面以前关注得比较少,恶补一下,推荐一个好的网站:并发编程网 - ifeve.com,上面全是各种大牛原创或编译的并发编程文章. 今天先来学习Semaphore(信号量),字面上看,根本不知道这东西是干啥的,借用 并发工具类(三)控制并发线程数的Semaphore一文中的交通红绿信号灯的例子来理解一下: 一条4车道的主干道,假设100米长,每辆车假设占用的长度为10米(考虑到前后车距),也就是说这条道上满负载运行的话,最多只能容纳4*(100/10)=40辆车,如果有120辆车要通过的

C#深入学习 ----多线程学习(一)第一天学习

学习最好的方法就是总结,并写下来,能让别人看懂,自己肯定是掌握了的. 针对软件开发,一直停留在能做的层次,今天得到大牛指点,觉得有必要对这门技术深入学习. 翻阅园内各大神的文章,收益匪浅,在这里做下总结.(以下大多数内容摘转自http://blog.csdn.net/xwdpepsi/article/details/6327210) 学习总结:多线程基本概念,临界区概念,锁的概念,监视器概念,以及基本操作,常见的坑等 习得一句话:为了保证程序的健壮性,所有if最好都加else处理,所有try最后

JAVA多线程--信号量(Semaphore)

简介 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者.但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动.拿到信号量的线程可以进入代码,否则就等待.通过acqu

一步一步学习多线程编程之CreateThread

CreatThread函数如下图所示 在这里我们只用到了第三个和第四个参数,第三个参数传递了一个函数的地址,也是我们要指定的新的线程.第四个参数是传给新线程的参数指针. // ThreadCreateTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<windows.h> int time = 0; void ThreadProc1() { int hour = 0; int mins = 0; while(1

iOS学习——多线程开发(NSThread)

首先我们得知道,cpu仅能同时处理一条线程,多线程并发并不是多条线程同时进行,而是cpu不断在线程间切换进行,所以线程并不是越多越好,当存在大量线程,会让cpu在切换间疲于奔命,反而不利于开发. 具体来说,iOS方面多线程也就是两种,pthread以及NSThread.pthread是C语言写的多线程,好处是不仅仅用在iOS移动端开发,基本上支持C语言的都可以使用,缺点就是C语言的共性了,不易识别,难记而且并不支持arc.所以在iOS中多线程开发还是去了解NSThread更好,pthread掌握

python学习 —— 多线程发送请求测试服务器压力

以前写过的python多线程终于派上用场了,其实还没开始测试,但下周会使用这个脚本测试一下,虽然boss让我用C++来做: # coding=utf-8 import random import string import threading import time from requests import post class MultiThread(threading.Thread): def __init__(self, url, qlock): threading.Thread.__in