package cn.pzh.xzh.javaee.thread;
import javafx.concurrent.Worker;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
/**
* 功能描述:
* 自定义线程池
* @author xzh
* @version 1.0
* @date 2023/2/19 12:54
*/
public class MyFixThreadPool {
/**
* 阻塞队列
*/
private BlockingQueue<Runnable> blockingQueue;
/**
* 工作线程
*/
private List<Worker> workers;
/**
* 工作状态标志
*/
private volatile boolean working = true;
/**
*
* @param coreSize 核心线程数
* @param queueSize 阻塞队列大小
*/
public MyFixThreadPool(int coreSize,int queueSize){
blockingQueue = new LinkedBlockingDeque(queueSize);
workers = new ArrayList<>(coreSize);
//初始化工作线程
for (int i = 0; i < coreSize; i++) {
//核心线程
Worker worker = new Worker(this);
workers.add(worker);
//启动工作线程
worker.start();
}
}
//为阻塞队列(仓库)添加任务
public boolean submit(Runnable task){
if (working) {
return this.blockingQueue.offer(task);
}
return false;
}
//关闭线程池
public void shutdown(){
//关闭工作状态
this.working = false;
//遍历工作线程 查找所有的阻塞中的线程(中断阻塞线程 防止关闭阻塞 关闭失效)
for (Thread t : this.workers){
//如果处于阻塞中
if (t.getState() == Thread.State.BLOCKED || t.getState() == Thread.State.WAITING || t.getState() == Thread.State.TIMED_WAITING){
//打断
t.interrupt();
}
}
}
static class Worker extends Thread{
MyFixThreadPool pool;
public Worker(MyFixThreadPool pool){
this.pool = pool;
}
@Override
public void run() {
//不断从阻塞队列中获取任务(线程池在工作 || 线程池仓库大于0)
while (this.pool.working || this.pool.blockingQueue.size()>0){
//任务线程
Runnable task = null;
try {
//线程池在运行 获取不到就阻塞等待
if (this.pool.working) {
task = pool.blockingQueue.take();
}
//线程池不在运行 获取不到继续执行(该方案为了解决线程池的关闭问题)*
else {
task = pool.blockingQueue.poll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
//获取成功马上执行
if (task !=null){
task.run();
}
}
}
}
}
手写线程池
最新推荐文章于 2024-07-22 14:15:06 发布