execute
把一个任务加到线程池中
public void execute(Runnable command) throws InterruptedException {
// 使用 延时加载 的方式来创建线程
// 当线程池中的线程数量少于阈值,则创建新线程执行该任务
// 否则添加进队列,等待其他线程结束之前的任务再执行该任务
if(pool.size() < MAX_WORKER_COUNT){
// 创建新线程
Worker worker = new Worker(queue);
// 执行任务
worker.start();
// 将 worker 添加到 线程池中
pool.add(worker);
}
queue.put(command);
}
shutdown
销毁线程池中的所有线程
调用每个线程的interrupt方法,使线程中断;调用 interrupt 后,每个线程并不是立即结束,而是可能等待一段时间,所以需要再使用 join 方法,来等待每个线程都执行结束
第一个循环触发异常,终止线程
第二个是等待每个线程结束
public void shutdown() throws InterruptedException {
// 终止掉所有的线程
for(Worker worker : pool){
worker.interrupt();
}
// interrupt后,每个线程不是立刻结束
// 需等待每个线程执行结束
for (Worker worker : pool){
worker.join();
}
}
public class ThreadDemo27 {
// 使用这个类描述 当前的工作线程
static class Worker extends Thread{
// 每个 worker 线程都需要从任务队列中取任务
// 需要能够获取到任务队列中的实例
private BlockingQueue queue = null;
public Worker(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run(){
// 此处 while被try 包裹: 只要线程收到异常,就会立刻结束 run 方法(结束线程)
try {
while (!Thread.currentThread().isInterrupted()){
Runnable command = queue.take();
command.run();
}
}
catch (InterruptedException e){
// 线程被结束
System.out.println(Thread.currentThread().getName() + " 线程结束");
}
}
}
static class MyThreadPool{
//线程池中最多可同时执行的线程数量
private static final int MAX_WORKER_COUNT = 5; // 一个线程内部应该有多少个线程,应该根据实际情况来定
// 阻塞队列: 用于组织若干个任务
private BlockingQueue queue = new LinkedBlockingQueue<>();
// List: 用于组织若干个工作线程
private List pool = new ArrayList<>();
/*
- 实现 execute 方法:
*/
public void execute(Runnable command) throws InterruptedException {
// 使用 延时加载 的方式来创建线程
// 当线程池中的线程数量少于阈值,则创建新线程执行该任务,否则添加进队列,等待其他线程结束之前的任务再执行该任务
if(pool.size() < MAX_WORKER_COUNT){
// 创建新线程
Worker worker = new Worker(queue);
// 执行任务
worker.start();
// 将 worker 添加到 线程池中
pool.add(worker);
}
queue.put(command);
}
/*
- 实现 shutdown 方法:
*/
public void shutdown() throws InterruptedException {
// 终止掉所有的线程
for(Worker worker : pool){
worker.interrupt();
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!