/**
* 所谓的信号量,其实就是一个控制线程的数目的构造
*/
public class SemaphoreDemo {
//用static 和final 这样就表明属于类级别的,既然是类级别的,那么可以认为是单例模式的
//也就是最大的并发访问量是3个,即同一时间
//构造参数:
/**
* 1.默认是非公平的,因为里面包含的是一个队列,要实现公平策略,初始化的时候,通过构造函数设置为true,即满足FIFO的原则
* 2.实现单例模式:
* 将Semaphore semaphore = new Semaphore(1),即满足单例模式
*/
private static final Semaphore semaphore = new Semaphore(3); //并发访问的线程数3个
//创建5个线程,利用线程池,因为创建完线程池,线程的启动即submit()或者execute()就是任务提交和线程启动的一个过程
private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
//静态内部类
private static class InformationThread extends Thread {
//本身是一个普通类,当继承了Thread类之后,就变成一个任务类,即异步处理的类当然他也有自己本身的属性
private final String name;
private final int age;
private InformationThread(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public void run() {
try {
/**
* 通过源码发现:
* acquire有两个方法类型:
* 一个是带参的,限制了获取共享资源的线程数
* 一个是不带参的,没有限制
* 当然是用在run方法中.
*/
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + ":大家好,我是" + name + "我今年" + age + "岁当前时间为:" + System.currentTimeMillis());
Thread.sleep(1000);
System.out.println(name + "要准备释放许可证了,当前时间为:" + System.currentTimeMillis());
System.out.println("当前可使用的许可数为:" + semaphore.availablePermits());
semaphore.release();
} catch (Exception e) {
e.getMessage();
}
}
}
public static void main(String[] args) {
String[] name = {"李明", "王五", "张杰", "王强", "赵二", "李四", "张三"};
int[] age = {26, 27, 33, 45, 19, 23, 41};
for (int i = 0; i < 7; i++) {
//创建一个对象的形式;
/**
* 1.利用多态的形式创建---即对象的引用(instanceof)
* 2.利用对象本身创建
*/
Thread thread = new InformationThread(name[i], age[i]);
threadPool.execute(thread);
}
}
}
参考博客: