Java的信号量实际上是一个功能完毕的计数器对控制一定资源的消费与回收有着很重要的意义信号量常常用于多线程的代码中并能监控有多少数目的线程等待获取资源并且通过信号量可以得知可用资源的数目等等这里总是在强调数目二字但不能指出来有哪些在等待哪些资源可用
因此本人认为这个信号量类如果能返回数目还能知道哪些对象在等待哪些资源可使用就非常完美了仅仅拿到这些概括性的数字对精确控制意义不是很大目前还没想到更好的用法
下面是一个简单例子
import ncurrentExecutorService;
import ncurrentExecutors;
import ncurrentSemaphore;
/**
* Java线程新特征信号量
*
* @author leizhimin ::
*/
public class Test {
public static void main(String[] args) {
MyPool myPool = new MyPool();
//创建线程池
ExecutorService threadPool = ExecutorsnewFixedThreadPool();
MyThread t = new MyThread(任务A myPool );
MyThread t = new MyThread(任务B myPool );
MyThread t = new MyThread(任务C myPool );
//在线程池中执行任务
threadPoolexecute(t);
threadPoolexecute(t);
threadPoolexecute(t);
//关闭池
threadPoolshutdown();
}
}
/**
* 一个池
*/
class MyPool {
private Semaphore sp; //池相关的信号量
/**
* 池的大小这个大小会传递给信号量
*
* @param size 池的大小
*/
MyPool(int size) {
thissp = new Semaphore(size);
}
public Semaphore getSp() {
return sp;
}
public void setSp(Semaphore sp) {
thissp = sp;
}
}
class MyThread extends Thread {
private String threadname;//线程的名称
private MyPool pool;//自定义池
private int x;//申请信号量的大小
MyThread(String threadname MyPool pool int x) {
thisthreadname = threadname;
thispool = pool;
thisx = x;
}
public void run() {
try {
//从此信号量获取给定数目的许可
poolgetSp()acquire(x);
//todo也许这里可以做更复杂的业务
Systemoutprintln(threadname + 成功获取了 + x + 个许可!);
} catch (InterruptedException e) {
eprintStackTrace();
} finally {
//释放给定数目的许可将其返回到信号量
poolgetSp()release(x);
Systemoutprintln(threadname + 释放了 + x + 个许可!);
}
}
}
任务B成功获取了个许可!
任务B释放了个许可!
任务A成功获取了个许可!
任务C成功获取了个许可!
任务C释放了个许可!
任务A释放了个许可!
Process finished with exit code
从结果可以看出信号量仅仅是对池资源进行监控但不保证线程的安全因此在使用时候应该自己控制线程的安全访问池资源
本文出自 熔 巖 博客请务必保留此出处