自定义线程池
线程池主要关注点
- 首先需要线程池里面的线程不能停止
- 还需要一个任务队列(任务队列可以让空闲线程处于wait状态)
- 线程初始化大小
- 每个线程run起来之后都必须去看任务里面有没有任务没有任务就wait, 有任务就在同步代码块中取出任务,然后在同步代码块外执行任务
具体实现
public class SimpleThreadPool {
private final int size;
private final static int DEFAULT_SIZE = 10;
private final static LinkedList<Runnable> TASK_QUEUE = new LinkedList<>();
private final static List<WorkerTask> THREAD_QUEUE = new ArrayList<>();
private final static ThreadGroup GROUP = new ThreadGroup("POOL_GROUP");
private final static String THREAD_PREFIX = "SIMPLE_THREAD_POOL-";
private static volatile int seq = 0;
public SimpleThreadPool() {
this(DEFAULT_SIZE);
}
public SimpleThreadPool(int size) {
this.size = size;
init();
}
private void init() {
for (int i = 0; i < size; i++) {
createWorkTask();
}
}
private void createWorkTask() {
WorkerTask task = new WorkerTask(GROUP, THREAD_PREFIX + (seq++));
task.start();
THREAD_QUEUE.add(task);
}
public void submit(Runnable task) {
synchronized (TASK_QUEUE) {
TASK_QUEUE.addLast(task);
TASK_QUEUE.notifyAll();
}
}
private enum TaskState {
FREE,RUNNING,BLOCKED,DEAD
}
private static class WorkerTask extends Thread {
private volatile TaskState taskState = TaskState.FREE;
public WorkerTask(ThreadGroup group, String name) {
super(group, name);
}
@Override
public void run() {
OUTER:
while (this.taskState != TaskState.DEAD) {
Runnable runnable;
synchronized (TASK_QUEUE) {
while (TASK_QUEUE.isEmpty()) {
try {
this.taskState = TaskState.BLOCKED;
TASK_QUEUE.wait();
} catch (InterruptedException e) {
break OUTER;
}
}
runnable = TASK_QUEUE.removeFirst();
}
this.taskState = TaskState.RUNNING;
runnable.run();
this.taskState = TaskState.FREE;
}
}
public void close() {
this.taskState = TaskState.DEAD;
}
}
public static void main(String[] args) {
SimpleThreadPool simpleThreadPool = new SimpleThreadPool(40);
IntStream.rangeClosed(0, 40)
.forEach(i -> {
simpleThreadPool.submit(()->{
System.out.println("The runnable " + i + " be serviced by " + Thread.currentThread() + " start.");
try {
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The runnable " + i + " be serviced by " + Thread.currentThread() + " finished.");
});
});
}
}