手写简单的线程池

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()自定义线程池(代码片段

手写线程池 - C++版

Linux下C/C++ 手写一个线程池-

手写线程池