简单的线程池实现

这是一个简单的Java线程池实现示例,通过`LinkedBlockingQueue`作为任务队列,创建固定数量的工作线程来执行任务。线程池支持批量和单个任务的提交,以及线程池的回收操作。代码中展示了如何初始化线程池、执行任务和回收资源的过程。
摘要由CSDN通过智能技术生成

简单的线程池实现

直接上代码

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @author if
 * Description: 简单线程池实现
 * date: 2021/4/12 20:07
 */
public class ThreadPoolImpl{
    //使用锁机制保证数据安全,线程安全
    private Queue<Runnable> taskQueue=new LinkedBlockingQueue<>();
    private List<Worker> workers=new ArrayList<>();
    private static final int DEFALUT_SIZE=10;
    private int size;
    private boolean running=true;

    /**
     * 单例
     */
    private static ThreadPoolImpl pool;
    public static ThreadPoolImpl invoke(int size){
        if(pool==null){
            pool=new ThreadPoolImpl(size==0?10:size);
        }
        return pool;
    }

    /**
     * 可多例
     */
    public ThreadPoolImpl() {
        this.size=DEFALUT_SIZE;
        init();
    }
    public ThreadPoolImpl(int size) {
        this.size = size;
        init();
    }

    class Worker extends Thread{
        private String name;
        public Worker(String name) {
            this.name = name;
        }
        @Override
        public void run() {
            while (running){
                Runnable task=taskQueue.poll();
                if(task!=null){
                    task.run();
                }
            }
        }
    }

    /**
     * 创建
     */
    public void init(){
        for(int i=0;i<size;i++){
            Worker worker=new Worker("work NO."+(i+1));
            worker.start();
            workers.add(worker);
            System.out.println(worker.name+" 创建成功");
        }
    }
    /**
     * 单个任务执行
     * @param task
     */
    public void excuteOne(Runnable task) {
        if(task!=null){
            taskQueue.add(task);
        }
    }

    /**
     * 多个任务执行
     * @param list
     */
    public void excuteList(List<Runnable> list) {
        if(list!=null&&list.size()>0){
            taskQueue.addAll(list);
        }
    }

    /**
     * 回收
     */
    public void recovery() {
        this.running=false;
        workers.clear();
        taskQueue.clear();
        System.out.println("线程池回收完毕");
    }

    /**
     * 测试
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        List<Runnable> list=new ArrayList<>();
        for(int i=0;i<100;i++){
            int finalI = i;
            Runnable task=new Runnable() {
                @Override
                public void run() {
                    System.out.println("task "+ finalI +"执行print任务");
                }
            };
            list.add(task);
        }
        Runnable oneTask=new Runnable() {
            @Override
            public void run() {
                System.out.println("-----测试单个任务的运行-----");
            }
        };
        ThreadPoolImpl pool=ThreadPoolImpl.invoke(10);
        pool.excuteList(list);
        pool.excuteOne(oneTask);
        //等待任务执行,现实应该是持续运行
        Thread.sleep(3*1000);
        pool.recovery();
    }
}

运行结果
work NO.1 创建成功
work NO.2 创建成功
work NO.3 创建成功
work NO.4 创建成功
work NO.5 创建成功
work NO.6 创建成功
work NO.7 创建成功
work NO.8 创建成功
work NO.9 创建成功
work NO.10 创建成功
task 0执行print任务
task 1执行print任务
task 2执行print任务
task 3执行print任务
task 4执行print任务
task 5执行print任务
task 6执行print任务
task 7执行print任务
task 8执行print任务
--------------省略----------------------
-----测试单个任务的运行-----
task 99执行print任务
task 98执行print任务
task 97执行print任务
task 96执行print任务
task 95执行print任务
task 94执行print任务
task 93执行print任务
线程池回收完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值