简单的线程池实现
直接上代码
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任务
线程池回收完毕