zoukankan      html  css  js  c++  java
  • Semaphore

    Semaphore 

    与操作系统概念中的 信号量和PV操作 类似 控制最大的并发线程数    *countdownLatch也可以实现类似功能

    Example

    // java program to demonstrate 
    // use of semaphores Locks 
    import java.util.concurrent.*; 
    
    //A shared resource/class. 
    class Shared 
    { 
        static int count = 0; 
    } 
    
    class MyThread extends Thread 
    { 
        Semaphore sem; 
        String threadName; 
        public MyThread(Semaphore sem, String threadName) 
        { 
            super(threadName); 
            this.sem = sem; 
            this.threadName = threadName; 
        } 
    
        @Override
        public void run() { 
            
            // run by thread A 
            if(this.getName().equals("A")) 
            { 
                System.out.println("Starting " + threadName); 
                try
                { 
                    // First, get a permit. 
                    System.out.println(threadName + " is waiting for a permit."); 
                
                    // acquiring the lock 
                    sem.acquire(); 
                
                    System.out.println(threadName + " gets a permit."); 
            
                    // Now, accessing the shared resource. 
                    // other waiting threads will wait, until this 
                    // thread release the lock 
                    for(int i=0; i < 5; i++) 
                    { 
                        Shared.count++; 
                        System.out.println(threadName + ": " + Shared.count); 
            
                        // Now, allowing a context switch -- if possible. 
                        // for thread B to execute 
                        Thread.sleep(10); 
                    } 
                } catch (InterruptedException exc) { 
                        System.out.println(exc); 
                    } 
            
                    // Release the permit. 
                    System.out.println(threadName + " releases the permit."); 
                    sem.release(); 
            } 
            
            // run by thread B 
            else
            { 
                System.out.println("Starting " + threadName); 
                try
                { 
                    // First, get a permit. 
                    System.out.println(threadName + " is waiting for a permit."); 
                
                    // acquiring the lock 
                    sem.acquire(); 
                
                    System.out.println(threadName + " gets a permit."); 
            
                    // Now, accessing the shared resource. 
                    // other waiting threads will wait, until this 
                    // thread release the lock 
                    for(int i=0; i < 5; i++) 
                    { 
                        Shared.count--; 
                        System.out.println(threadName + ": " + Shared.count); 
            
                        // Now, allowing a context switch -- if possible. 
                        // for thread A to execute 
                        Thread.sleep(10); 
                    } 
                } catch (InterruptedException exc) { 
                        System.out.println(exc); 
                    } 
                    // Release the permit. 
                    System.out.println(threadName + " releases the permit."); 
                    sem.release(); 
            } 
        } 
    } 
    
    // Driver class 
    public class SemaphoreDemo 
    { 
        public static void main(String args[]) throws InterruptedException 
        { 
            // creating a Semaphore object 
            // with number of permits 1 
            Semaphore sem = new Semaphore(1); 
            
            // creating two threads with name A and B 
            // Note that thread A will increment the count 
            // and thread B will decrement the count 
            MyThread mt1 = new MyThread(sem, "A"); 
            MyThread mt2 = new MyThread(sem, "B"); 
            
            // stating threads A and B 
            mt1.start(); 
            mt2.start(); 
            
            // waiting for threads A and B 
            mt1.join(); 
            mt2.join(); 
            
            // count will always remain 0 after 
            // both threads will complete their execution 
            System.out.println("count: " + Shared.count); 
        } 
    } 
    Starting A
    Starting B
    A is waiting for a permit.
    B is waiting for a permit.
    A gets a permit.
    A: 1
    A: 2
    A: 3
    A: 4
    A: 5
    A releases the permit.
    B gets a permit.
    B: 4
    B: 3
    B: 2
    B: 1
    B: 0
    B releases the permit.
    count: 0
  • 相关阅读:
    WEB API 系列(二) Filter的使用以及执行顺序
    C# 各个版本特征
    dapper使用
    windows设置自动清理log
    [Mime] MimeReader--读取Mime的帮助类 (转载)
    [Mime] MimeHeaders--MimeHeader帮助类 (转载)
    [Mime] MimeEntity--MimeEntity Mime实体帮助类 (转载)
    [Mime] MediaTypes--电子邮件类型类 (转载)
    [Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)
    [功能帮助类] JsHelper--Javascript操作帮助类 (转载)
  • 原文地址:https://www.cnblogs.com/lnas01/p/11255978.html
Copyright © 2011-2022 走看看