自定义线程池
线程池主要关注点
首先需要线程池里面的线程不能停止 还需要一个任务队列(任务队列可以让空闲线程处于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." ) ;
} ) ;
} ) ;
}
}