用Java手写一个简单线程池

思路:

1.首先要定义线程数量以及任务数量

2.让定义的线程保持运行状态,执行线程的start方法

3.定义一个方法来执行任务,原理就是 往队列里面放线程任务

/**
 * 手写简单线程池
 */
public class Test2 {
   
    //定义一个有界队列来存放线程任务
    private static LinkedBlockingDequelinkedBlockingDeque;
    //线程池开关
    private Boolean isOpen=true;

    /**
     * 1.定义线程池方法, 传入线程数量和任务数量
     * @param runnableSize
     * @param ququqCount
     */
    public Test2(int runnableSize,int ququqCount){
        //workThreadList=new ArrayList<>(runnableSize);
        linkedBlockingDeque=new LinkedBlockingDeque<>(ququqCount);
        for (int i = 0; i < runnableSize; i++) {
            WorkThread workThread = new WorkThread();
            workThread.start();
        }
    }

    /**
     * 2.线程运行
     * 所以线程保持运行状态
     */
    class WorkThread extends Thread{
        @Override
        public void run() {
            //如果队列中还有线程任务 或者 线程池开关是开启
            while (linkedBlockingDeque.size()>0||isOpen){
                //循环执行线程任务
                Runnable poll = linkedBlockingDeque.poll();
                if (poll!=null){
                    poll.run();
                }
            }
        }
    }
    //线程执行的方法
    public Boolean execute(Runnable runnable){
       return linkedBlockingDeque.offer(runnable);
    }

    //测试线程池
    public static void main(String[] args) {
        //创建3个线程,10个任务
        Test2 test2=new Test2(3,10);
        for (int i = 0; i <10; i++) {
            final int count=i;
            Boolean execute = test2.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("线程名称:" + Thread.currentThread().getName()+",执行次数:"+count);
                }
            });
        }

    }}

你可能感兴趣的:(java,开发语言)