使用wait()和notifyAll()方法自定义线程池

声明:

  1、该篇只是提供一种自定义线程池的实现方式,可能性能、安全等方面需要优化;

  2、该篇自定义线程池使用的是wait()和notifyAll()方法,也可以使用Lock结合Condition来实现;

  3、该篇力求使用简单的方式呈现,如有错误之处,欢迎指正,在此表示感谢。

概述

  自定义线程池三要素包括:

  1、存储线程的容器(或叫线程池)。该容器可使用数组或链表,容器中存放执行线程,本篇使用链表实现。

  2、执行线程(或叫执行器)。具体执行的线程。

  3、执行任务。执行线程需要执行的具体任务。

代码

  1、任务接口

/**
 * 任务接口
 *
 */
public interface Task {
    
    /**
     * 执行具体任务
     */
    void executeSpecificTask();

}

  2、执行线程接口

/**
 * 执行线程接口
 *
 */
public interface Executor {
    
    /**
     * 设置执行任务
     * 
     * @param task 执行任务
     */
    void setTask(Task task);
    
    
    /**
     * 获取执行任务
     * 
     * @return Task
     */
    Task getTask();
    
    
    /**
     * 启动该任务
     */
    void startTask();

}

  3、线程池接口  

/**
 * 线程池接口
 *
 */
public interface Pool {
    
    /**
     * 获取执行线程
     * 
     * @return Executor
     */
    Executor getExecutor();
    
    /**
     * 销毁线程池容器中的所有执行线程
     */
    void destroy();
    
    
    /**
     * 获取线程池容器中执行线程数量
     * 
     * @return int
     */
    int getPoolSize();

}

  4、自定义线程池具体实现

/**
 * 自定义线程池具体实现
 *
 */
public class ThreadPool implements Pool{
    
    //是否关闭线程池,true-关闭线程池,false-不关闭线程池
    private boolean isShut;
    
    //默认执行线程个数
    private final static int DEFAULT_THREAD_SIZE = 6;
    
    //执行线程个数,默认为DEFAULT_THREAD_SIZE大小
    private static int THREAD_SIZE = DEFAULT_THREAD_SIZE;
    
    //存放执行线程的容器
    private LinkedList<Executor> list = new LinkedList<Executor>();
    
    public ThreadPool(){
        this(DEFAULT_THREAD_SIZE);
    }
    
    public ThreadPool(int threadSize){
        isShut = false;
        THREAD_SIZE = threadSize > 0 ? threadSize : DEFAULT_THREAD_SIZE;
        for(int i = 0;i < THREAD_SIZE;i++){
            Executor executor = new ExecutorImpl();
            ((ExecutorImpl)executor).setName("执行器" + i);
            
            //将执行器加入容器中
            list.add(executor);
            
            ((ExecutorImpl)executor).start();//启动执行器
        }
    }

    @Override
    public Executor getExecutor() {
        Executor executor = null;
        synchronized (list) {
            if(list.size() > 0){
                executor = list.removeFirst();
            }else{
                try {
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                executor = list.removeFirst();
            }
        }
        return executor;
    }

    @Override
    public void destroy() {
        synchronized (list) {
            isShut = true;
            list.notifyAll();
            list.clear();
        }
    }
    
    public  int getPoolSize(){
        synchronized (list) {
            return list.size();
        }
    }
    
    private class ExecutorImpl extends Thread implements Executor{
        
        //执行任务
        private Task task;
        
        //锁对象
        private final Object lock = new Object();
        
        public void run(){
            System.out.println(Thread.currentThread().getName() + " 启动>>>>>>>>>>");
            while(!isShut){
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + " 等待<<<<<<<<<<");
                    try {
                        //初始化线程池时,等待通知并释放锁
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + " 执行任务......");
                //执行具体任务
                getTask().executeSpecificTask();
                System.out.println(Thread.currentThread().getName() + " 执行任务完毕......");
                synchronized (list) {
                    System.out.println(Thread.currentThread().getName() + " 返回容器......");
                    //当前执行线程执行完毕后,返回到容器中
                    list.addFirst(ExecutorImpl.this);
                    //给别的执行线程发送通知
                    list.notifyAll();
                }
            }
        }
        
        public void startTask(){
            synchronized (lock) {
                lock.notify();
            }
        }

        @Override
        public void setTask(Task task) {
            this.task = task;
        }

        @Override
        public Task getTask() {
            return this.task;
        }
        
    }

}

  5、执行任务实现 

/**
 * 打印执行任务实现
 *
 */
public class PrintTask implements Task {

    @Override
    public void executeSpecificTask() {
        System.out.println("打印任务");
    }

}

  6、测试

public class Test {
    
    public static void main(String[] args) {
        
        Pool pool = new ThreadPool(2);
        
        for(int i = 0;i < 2;i++){
            Executor executor = pool.getExecutor();
            Task task = new PrintTask();
            executor.setTask(task);
            executor.startTask();
        }
        
        pool.destroy();
        
    }

}

  7、测试结果

执行器0 启动>>>>>>>>>>
执行器0 等待<<<<<<<<<<
执行器1 启动>>>>>>>>>>
执行器1 等待<<<<<<<<<<
执行器0 执行任务......
打印任务
执行器0 执行任务完毕......
执行器0 返回容器......
执行器1 执行任务......
打印任务
执行器1 执行任务完毕......
执行器1 返回容器......

 

转载于:https://www.cnblogs.com/wuq126/p/5412602.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值