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并发