第一节
package threadpool;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.IntStream;
/*
*
*/
public class SimpleThreadPool {
private final int size;
private final static int DEFAULT_SIZE = 10;
private static volatile int seq = 0;
private final static String THREAD_PREFIX = "SIMPLE_THREAD_POOL_";
private final static ThreadGroup GROUP = new ThreadGroup("POOL_GROUP");
private final static LinkedList<Runnable> TASK_QUEUE = new LinkedList<>();
private final static List<WorkerTask> THREAD_QUEUE = new ArrayList<>();
private static enum TaskState {
FREE, RUNNING, BLOCKED, DEAD
}
public SimpleThreadPool() {
this(DEFAULT_SIZE);
}
public SimpleThreadPool(int size) {
this.size = size;
init();
}
/*
* 初始化10个工作队列
*/
private void init() {
for (int i = 0; i < size; i++) {
createWorkTask();
}
}
/**
* 提交任务
*
* @param runnable
*/
public void submit(Runnable runnable) {
synchronized (TASK_QUEUE) {
TASK_QUEUE.addLast(runnable);
TASK_QUEUE.notifyAll();
}
}
/**
* 工作任务 每个任务需要开启一个线程
*/
private void createWorkTask() {
WorkerTask task = new WorkerTask(GROUP, THREAD_PREFIX + (seq++));
task.start();
TASK_QUEUE.add(task);
}
public static void main(String[] args) {
SimpleThreadPool threadPool = new SimpleThreadPool();
IntStream.range(0, 10).forEach(i -> threadPool.submit(
() -> {
System.out.println("The runable: " + i + " be serviced by: " + Thread.currentThread() + " start");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out
.println(
"The runable: " + i + " be serviced by: " + Thread.currentThread() + " finished");
})
);
}
private static class WorkerTask extends Thread {
private volatile TaskState taskState = TaskState.FREE;
public TaskState getTaskState() {
return this.taskState;
}
public WorkerTask(ThreadGroup group, String name) {
super(group, name);
}
@Override
public void run() {
OUTER:
if (this.taskState != TaskState.DEAD) {
Runnable runnable;
synchronized (TASK_QUEUE) {
while (TASK_QUEUE.isEmpty()) {
try {
taskState=TaskState.BLOCKED;
TASK_QUEUE.wait();
} catch (InterruptedException e) {
e.printStackTrace();
break OUTER;
}
}
runnable = TASK_QUEUE.removeFirst();
}
if (runnable != null) {
taskState = TaskState.RUNNING;
runnable.run();
taskState = TaskState.FREE;
}
}
}
}
}