参考:
(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;
}
}