admin 管理员组文章数量: 887007
手写线程池,理清相关原理
准备工作:
- 需要一个任务仓库
- 集合容器,存放工作线程
- 普通线程要执行多个task,咱们需要封装一下
- 初始化线程池
- 对外提供提交任务的接口 非阻塞; 对外提供提交任务的接口 阻塞
- 关闭线程池
a. 禁止往队列提交任务
b. 等待仓库中的任务执行
c. 关闭的时候,再去那任务就不用阻塞,因为不会有新任务来了
d. 关闭的时候,阻塞的线程,就要强行中断阻塞/等待的线程
代码地址:
代码展示:
package threadpoolimpl.fixedthreadpoolImpl.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
public class FixedThreadPool {
//定义pool是否shutdown
private boolean isShutDown = false; //1.定义任务仓库
private LinkedBlockingQueue<Thread> queue;
//2.定义工作线程组
private List<Thread> threadWorkList;//3.封装work thread
public static class WorkThread extends Thread {private FixedThreadPool fixedThreadPool;public WorkThread(FixedThreadPool pool) {this.fixedThreadPool = pool;}@Overridepublic void run() {while (!this.fixedThreadPool.isShutDown || this.fixedThreadPool.queue.size() > 0) {Thread task = null;try {if (!this.fixedThreadPool.isShutDown)task = this.fixedThreadPool.queue.take();elsetask = this.fixedThreadPool.queue.poll();} catch (InterruptedException e) {e.printStackTrace();}if (task != null) {task.run();}}}
}//4. init thread pool
public FixedThreadPool(int poolSize, int queueSize) {if (poolSize <= 0 || queueSize <= 0) {throw new IllegalArgumentException("illegal parameter");}this.threadWorkList = Collections.synchronizedList(new ArrayList<>(poolSize));this.queue = new LinkedBlockingQueue<>(queueSize);for (int i = 0; i < poolSize; i++) {WorkThread workThread = new WorkThread(this);workThread.start();this.threadWorkList.add(workThread);}
}//5.1 non- block submit
public boolean nonBlockSubmit(Thread thread) {if (this.isShutDown = false) {return false;}return this.queue.offer(thread);
}//5.2 block submit
public boolean blockSubmit(Thread thread) {try {if (this.isShutDown = false) {return false;}this.queue.put(thread);return true;} catch (InterruptedException e) {e.printStackTrace();return false;}
}
//6. 关闭线程池a. 禁止往队列提交任务b. 等待仓库中的任务执行c. 关闭的时候,再去那任务就不用阻塞,因为不会有新任务来了d. 关闭的时候,阻塞的线程,就要强行中断
public void shutdown() {this.isShutDown = true;for (Thread thread : this.threadWorkList) {if (thread.getState().equals(Thread.State.BLOCKED) || thread.getState().equals(Thread.State.WAITING)|| thread.getState().equals(Thread.State.TIMED_WAITING)) {thread.interrupt();}}
}
}
如果还有什么不明白之处,请联系我啊
本文标签: 手写线程池,理清相关原理
版权声明:本文标题:手写线程池,理清相关原理 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732362278h1535552.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论