package com.f.fmodules.fuser.semaphore; public class MyThread extends Thread { private SemaphoreService service; public MyThread(String name, SemaphoreService service) { super(); this.setName(name); this.service = service; } @Override public void run() { this.service.doSomething(); } }
package com.f.fmodules.fuser.semaphore; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Semaphore; public class SemaphoreService { private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); /**同步關鍵類,構造方法傳入的數字是多少,則同一個時刻,只運行多少個進程同時運行制定代碼*/ private Semaphore semaphore = new Semaphore(3); /** * 在 semaphore.acquire() 和 semaphore.release()之間的代碼,同一時刻只容許制定個數的線程進入, * 由於semaphore的構造方法是1,則同一時刻只容許一個線程進入,其餘線程只能等待。 * */ public void doSomething() { try { semaphore.acquire(); System.out.println(Thread.currentThread().getName() + ":doSomething start-" + getFormatTimeStr()); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + ":doSomething end-" + getFormatTimeStr()); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } private static String getFormatTimeStr() { return sf.format(new Date()); } }
package com.f.fmodules.fuser.semaphore; public class SemaphoreTest { public static void main(String args[]) { SemaphoreService service = new SemaphoreService(); for (int i = 0; i < 10; i++) { MyThread t = new MyThread("thread" + (i + 1), service); t.start();// 這裏使用 t.run() 也能夠運行,可是不是併發執行了 } } }
運行結果java
實踐證實,確實是同一個時刻只有一個線程能訪問,那若是把 Semaphore 的構造方法入參改爲 5併發