zoukankan      html  css  js  c++  java
  • 14.Java5的Semaphere同步工具

     1 import java.util.concurrent.ExecutorService;
     2 import java.util.concurrent.Executors;
     3 import java.util.concurrent.Semaphore;
     4 
     5 /**
     6  * 14.Java5的Semaphere同步工具
     7  *         Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。
     8  * 使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个
     9  * 文件允许的并发访问数。
    10  *         单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由
    11  * 一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
    12  * @author LiTaiQing
    13  *
    14  */
    15 public class SemaphoreTest {
    16     public static void main(String[] args) {
    17         ExecutorService service = Executors.newCachedThreadPool();
    18         final Semaphore sp = new Semaphore(3);
    19         for (int i = 0; i < 10; i++) {
    20             Runnable runnable = new Runnable() {
    21                 public void run() {
    22                     try {
    23                         sp.acquire();
    24                     } catch (InterruptedException e1) {
    25                         e1.printStackTrace();
    26                     }
    27                     System.out.println("线程" + Thread.currentThread().getName()
    28                             + "进入,当前已有" + (3 - sp.availablePermits()) + "个并发");
    29                     try {
    30                         Thread.sleep((long) (Math.random() * 10000));
    31                     } catch (InterruptedException e) {
    32                         e.printStackTrace();
    33                     }
    34                     System.out.println("线程" + Thread.currentThread().getName()
    35                             + "即将离开");
    36                     sp.release();
    37                     // 下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
    38                     System.out.println("线程" + Thread.currentThread().getName()
    39                             + "已离开,当前已有" + (3 - sp.availablePermits()) + "个并发");
    40                 }
    41             };
    42             service.execute(runnable);
    43         }
    44     }
    45 }
  • 相关阅读:
    数组
    基本类型与封装类
    类与对象以及引用以及内存
    (一)eclipse Dynamic web project 工程目录以及文件路径问题
    jdbc
    连接
    curl命令
    java annotation
    websocket
    Trie(前缀树)和ternary trie和binary search tree
  • 原文地址:https://www.cnblogs.com/litaiqing/p/4650953.html
Copyright © 2011-2022 走看看