码迷,mamicode.com
首页 > 编程语言 > 详细

手写简单的线程池

时间:2020-03-18 18:43:41      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:bool   end   自己   ini   sync   iss   this   cat   runnable   

线程池的基本原理

声明任务队列、线程数量这两者数量主要由自己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();//中断
        }
    }
}

  

手写简单的线程池

标签:bool   end   自己   ini   sync   iss   this   cat   runnable   

原文地址:https://www.cnblogs.com/jsyFoi/p/12519038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!