Semaphore维护当前访问自身的线程个数

可以实现流量控制,同时访问文件的用户数

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 service = Executors.newCachedThreadPool();
        final  Semaphore sp = new Semaphore(3);//创建Semaphore信号量,初始化许可大小为3
        Runnable runnable = new Runnable(){
            public void run(){
            try {
                sp.acquire();//请求获得许可,如果有可获得的许可则继续往下执行,许可数减1。否则进入阻塞状态
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            System.out.println("线程" + Thread.currentThread().getName() + 
                    "进入,当前已有" + (3-sp.availablePermits()) + "个并发");
            try {
                Thread.sleep((long)(Math.random()*10000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程" + Thread.currentThread().getName() + 
                    "即将离开");                    
            sp.release();//释放许可,许可数加1
            //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
            System.out.println("线程" + Thread.currentThread().getName() + 
                    "已离开,当前已有" + (3-sp.availablePermits()) + "个并发");                    
        }
    };
        for(int i=0;i<10;i++){
            service.execute(runnable); //提交十个任务           
        }
    }                                                                                                                   

}
时间: 2024-12-30 03:00:38

Semaphore维护当前访问自身的线程个数的相关文章

Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行

Semaphore控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. Semaphore控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. Semaphore控制同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. 原文地址:https://www.cnblogs.com/panxuejun/p/86

cuda中当元素个数超过线程个数时的处理案例

项目打包下载 当向量元素超过线程个数时的情况 向量元素个数为(33 * 1024)/(128 * 128)=2.x倍 1 /* 2 * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. 3 * 4 * NVIDIA Corporation and its licensors retain all intellectual property and 5 * proprietary rights in and to this s

关于CoreData和SQLite多线程访问时的线程安全问题

http://www.jianshu.com/p/95db3fc4deb3 关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两者都需要设置线程安全,在这里以FMDB来解释对SQLite的线程安全访问. 一:FMDB的线程安全:(以读取图片为例) 1.没有线程安全的执行方式: //****

linux 进程的最大线程个数

1. 可以通过下面的方法查到: cat /proc/sys/kernel/threads-max 15882 另外,一个进程实际的线程个数,可以从 /proc/{PID}/status里得出: /proc/544#cat status Name: kpsmoused State: S (sleeping) Tgid: 544 Pid: 544 PPid: 2 TracerPid: 0 Uid: 0 0 0 0 Gid: 0 0 0 0 FDSize: 32 Groups: <strong>Th

JPDA 架构研究7 - Agent利用环境指针访问VM(线程组管理篇)

引入: 上篇文章中我们讨论了Agent利用环境指针访问VM的线程操作,这里讨论线程组操作. 分类3:线程组操作 a.GetTopThreadGroups.让Agent获取VM中的所有全局的线程组. jvmtiError GetTopThreadGroups(jvmtiEnv* env,             jint* group_count_ptr,             jthreadGroup** groups_ptr) 函数会返回全局的线程组的数量和线程组的列表. b.GetThre

线程格中的线程块和线程块中的线程个数限制

线程块中的线程个数限制: 线程格中的线程块限制:

CoreData和SQLite多线程访问时的线程安全

关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两者都需要设置线程安全,在这里以FMDB来解释对SQLite的线程安全访问. 一:FMDB的线程安全:(以读取图片为例) 1.没有线程安全的执行方式: //************** 数据库保存图片 ******************/

CoreData和SQLite多线程访问时的线程安全问题

数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两者都需要设置线程安全,在这里以FMDB来解释对SQLite的线程安全访问. 一:FMDB的线程安全:(以读取图片为例) 1.没有线程安全的执行方式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

主线程与子线程个数,以及分辨

# 主线程与子线程 import threading import time def run(n): print('task',n,threading.current_thread())#threading.current_thread()打印当前线程 time.sleep(2) print('task done',n) for i in range(50):#循环里边全是子线程,t-1是子线程,不是主线程 t= threading.Thread(target=run,args=('t-%s'%