一. 实现线程池步骤
七大核心参数全部都使用上:
1. 2个核心线程 (2个工作员工)
2. 池中可以有5个线程 (最多有5个员工)
3. 1秒后判断是否过了高峰期,需不需要撤掉其他员工
4. 时间的单位
5. 任务队列 (候客区设置为3位)
6. 线程工厂 (默认银行Logo)
7. 隔离策略 (超过我设置的最大员工数加候客区人数,就会拒绝其他客户在这个银行办公)
不熟悉线程池七大核心参数请看这篇:细说线程池七大核心参数
二. 四大隔离策略与手写线程池
1. 使用默认隔离策略
//线程池
public static void main(String[] args) {
ExecutorService threadPool =
new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
//默认策略,可以报异常
//9个客户超过了设置的客户上限就会报错: RejectedExecutionException
//模拟出10个客户,来办理业务,一个用户代表一个请求线程
try {
//10个客户
for (int i = 1; i <= 10; i++) {
//启动
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "\t 办理业务。。。");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
threadPool.shutdown();
}
}
运行结果:
2. 使用回调策略
//线程池
public static void main(String[] args) {
ExecutorService threadPool =
new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
//回调策略
//不会报错,如果线程不够用,会推回到调用者那里去,例如推回到main线程
//模拟出10个客户,来办理业务,一个用户代表一个请求线程
try {
//10个客户
for (int i = 1; i <= 10; i++) {
//启动
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "\t 办理业务。。。");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
threadPool.shutdown();
}
}
运行结果:
3. 使用丢弃最久策略
//线程池
public static void main(String[] args) {
ExecutorService threadPool =
new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy());
//丢弃最久策略
//不会报错,但是会丢掉线程,输出的就是最大线程数加候客区人数
//模拟出10个客户,来办理业务,一个用户代表一个请求线程
try {
//10个客户
for (int i = 1; i <= 10; i++) {
//启动
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "\t 办理业务。。。");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
threadPool.shutdown();
}
}
运行结果:
4. 使用丢弃策略
//线程池
public static void main(String[] args) {
ExecutorService threadPool =
new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());
//丢弃策略
//不会报错,但是会丢掉线程,输出的就是最大线程数加候客区人数
//如果允许丢失任务,这个策略是最好的
//模拟出10个客户,来办理业务,一个用户代表一个请求线程
try {
//10个客户
for (int i = 1; i <= 10; i++) {
//启动
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "\t 办理业务。。。");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
threadPool.shutdown();
}
}
运行结果: