Java 自定义线程池

参考:

(1)Java中终止(销毁)线程的方法:https://blog.csdn.net/qq_37465368/article/details/80869218

 

 

我:

注意:不适用于单例对象如@Autowird的调用

 

/**
 * 自定义任务接口类
 * @author WuGuiXin
 * @date 2020-01-19
 */
public interface MyTask {

    void execute(Object[] params) ;

}

 


import lombok.Data;

/**
 * 自定义任务线程类
 *
 * @author WuGuiXin
 * @qq 1393180819
 * @date 2020-01-19
 */
@Data
public class TaskThread extends Thread {

    private MyTask myTask; // 任务
    private Object[] params;// 任务方法的参数
    private Boolean running = false; // 阻塞标记,默认为false
    private Boolean breaked = false; // 跳出循环标记,默认为false

    public TaskThread() {
        super();
    }

    @Override
    public void run() {
        while (running) {
            // 执行任务方法
            myTask.execute(params);
            // 执行完毕后,阻塞线程,并判断 是否 跳出循环
            running = false;
            if (breaked) {
                // 跳出循环
                break;
            } else {
                // 返回线程池
                TaskThreadPool.backThreadToPool(this);
            }
        }
    }


}
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;

import java.util.Vector;

/**
 * 自定义任务线程池
 * @author WuGuiXin
 * @qq 1393180819
 * @date 2020-01-19
 */
@Data
public class TaskThreadPool {

    private static int useNum = 0; // 正在使用的线程数

    // 同步 线程池
    public static Vector<TaskThread> pool = new Vector<>();
    // 线程初始个数
    //@Value(value="${task}")
    private static final int INIT_SIZE = 10;
    // 线程最大个数
    private static final int MAX_SIZE = 30;

//    static{
//        for(int i=0; i<INIT_SIZE; i++){
//            addTaskThread();
//        }
//    }

    // 新增线程
    private synchronized  static void addTaskThread(){
        useNum = useNum +1;
        System.out.println("正在使用的线程数:"+useNum+";线程池闲置线程数:"+pool.size());
        TaskThread th = new TaskThread();
        th.setRunning(false); // 阻塞线程
        th.start(); // 启动线程
        pool.add(th); // 存入线程池
    }

    // 获取线程
    public synchronized  static TaskThread getThreadFromPool(){
        if(pool.isEmpty()){
            addTaskThread();
        }
        TaskThread th = pool.lastElement();
        pool.removeElement(th);
        return th;
    }

    // 返回 或 结束 线程
    public synchronized static void backThreadToPool(TaskThread th)  {
        if(pool.size()<=MAX_SIZE){
            pool.add(th);
        }else{
            // 跳出循环,结束线程
            th.setBreaked(true);
        }
        useNum = useNum - 1;
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值