手写简单的线程池
Posted jsyfoi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写简单的线程池相关的知识,希望对你有一定的参考价值。
线程池的基本原理
声明任务队列、线程数量这两者数量主要由自己init,往队列中添加任务,如果超过数量则等待(阻塞),否则加入线程执行
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; public class ThreadPoolDemo { //是否停止工作 //volatile保证线程访问此值的一致性 private volatile boolean isStop=false; //1.任务队列 private BlockingQueue<Runnable> blockingQueue; //2.线程 private List<Thread> workers; //3.执行线程 public class Worker extends Thread{ private ThreadPoolDemo threadPoolDemo=null; public Worker(ThreadPoolDemo poolDemo){ this.threadPoolDemo=poolDemo; } @Override public void run(){ //没有停止且队列内还有任务 while (!this.threadPoolDemo.isStop||this.threadPoolDemo.blockingQueue.size()>0){ Runnable task=null; try { if(!this.threadPoolDemo.isStop){ //阻塞获取 task=this.threadPoolDemo.blockingQueue.take(); }else{ //非阻塞获取(主要是将队列中的任务执行完毕) task=this.threadPoolDemo.blockingQueue.poll(); } } catch (InterruptedException e) { e.printStackTrace(); } if(task!=null) task.run(); } } } //初始化线程 public ThreadPoolDemo(int poolSize,int threadSize){ if(poolSize<=0||threadSize<=0){ throw new IllegalArgumentException("非法参数"); } this.blockingQueue= new LinkedBlockingDeque<>(poolSize); //线程安全 this.workers=Collections.synchronizedList(new ArrayList<Thread>()); for(int i=0;i<threadSize;i++){ Worker worker=new Worker(this); worker.start(); workers.add(worker); } } //将任务扔到队列中(阻塞) public void submit(Runnable task) throws InterruptedException { this.blockingQueue.put(task); } //关闭线程 public void shutDown(){ isStop=true; for(Thread thread:workers){ thread.interrupt();//中断 } } }
以上是关于手写简单的线程池的主要内容,如果未能解决你的问题,请参考以下文章
手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段