接上篇
为了更好的利用资源,线程池需要动态调整线程数量。
首先,定义好最小线程,活跃线程,最大线程数量
private static int min;
private static int active;
private static int max;
在线程池执行任务过程中,还需要有另一线程负责线程的新建和回收。因此简单让SimpleThreadPool继承Thread,覆写run方法
@Override
public void run() {
while (!isShutDown) {
try {
//
System.out.printf("Min:%d,Active:%d,Max:%d,TaskSize:%d,CurrentTaskExecutors:%d\n", min, active, max
, TASK_QUEUE.size(), TASK_EXECUTORS.size());
if (TASK_QUEUE.size() > active && size < active) {
int toBeCreated = active - size;
for (int i = 0; i < toBeCreated; i++) {
TaskExecutor taskExecutor = createExecutor();
TASK_EXECUTORS.add(taskExecutor);
}
size = active;
} else if (TASK_QUEUE.size() > max && size < max) {
int toBeCreated = max - size;
for (int i = 0; i < toBeCreated; i++) {
TaskExecutor taskExecutor = createExecutor();
TASK_EXECUTORS.add(taskExecutor);
}
size = max;
}
synchronized (TASK_EXECUTORS) {
if (TASK_QUEUE.isEmpty() && size > active) {
int toBeRemoved = size - active;
for (Iterator<TaskExecutor> it = TASK_EXECUTORS.iterator(); it.hasNext(); ) {
TaskExecutor taskExecutor = it.next();
if (toBeRemoved <= 0) {
break;
}
if (taskExecutor.getTaskState() == TaskState.RUNNING) {
continue;
}
//
System.out.println("--------reduce----------");
taskExecutor.shutdown();
taskExecutor.interrupt();
it.remove();
toBeRemoved--;
}
size = active;
}
}
Thread.sleep(5_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
测试
public class SimpleThreadPoolTest {
public static void main(String[] args) throws Exception {
SimpleThreadPool pool = new SimpleThreadPool();
for (int i = 0; i < 40; i++) {
int finalI = i;
pool.addTask(() -> {
System.out.println(Thread.currentThread().getName() + " ==> is execute task " + finalI);
try {
Thread.sleep(5_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
pool.shutdown();
//pool.addTask(() -> System.out.println("==="));
}
结果
Min:4,Active:8,Max:12,TaskSize:0,CurrentTaskExecutors:4
toBeCreated 1 4
SIMPLE_THREAD_POOL-0 ==> is execute task 3
SIMPLE_THREAD_POOL-2 ==> is execute task 1
SIMPLE_THREAD_POOL-3 ==> is execute task 0
SIMPLE_THREAD_POOL-4 ==> is execute task 4
SIMPLE_THREAD_POOL-1 ==> is execute task 2
SIMPLE_THREAD_POOL-5 ==> is execute task 5
SIMPLE_THREAD_POOL-6 ==> is execute task 6
SIMPLE_THREAD_POOL-7 ==> is execute task 7
SIMPLE_THREAD_POOL-0 ==> is execute task 8
SIMPLE_THREAD_POOL-1 ==> is execute task 12
SIMPLE_THREAD_POOL-4 ==> is execute task 11
SIMPLE_THREAD_POOL-2 ==> is execute task 9
SIMPLE_THREAD_POOL-3 ==> is execute task 10
Min:4,Active:8,Max:12,TaskSize:26,CurrentTaskExecutors:8
SIMPLE_THREAD_POOL-6 ==> is execute task 13
SIMPLE_THREAD_POOL-5 ==> is execute task 14
SIMPLE_THREAD_POOL-7 ==> is execute task 15
SIMPLE_THREAD_POOL-8 ==> is execute task 16
SIMPLE_THREAD_POOL-9 ==> is execute task 17
SIMPLE_THREAD_POOL-10 ==> is execute task 18
SIMPLE_THREAD_POOL-11 ==> is execute task 19
SIMPLE_THREAD_POOL-0 ==> is execute task 20
SIMPLE_THREAD_POOL-2 ==> is execute task 23
SIMPLE_THREAD_POOL-1 ==> is execute task 21
SIMPLE_THREAD_POOL-4 ==> is execute task 22
SIMPLE_THREAD_POOL-3 ==> is execute task 24
SIMPLE_THREAD_POOL-6 ==> is execute task 25
SIMPLE_THREAD_POOL-10 ==> is execute task 30
SIMPLE_THREAD_POOL-7 ==> is execute task 27
SIMPLE_THREAD_POOL-5 ==> is execute task 26
SIMPLE_THREAD_POOL-9 ==> is execute task 28
Min:4,Active:8,Max:12,TaskSize:11,CurrentTaskExecutors:12
SIMPLE_THREAD_POOL-8 ==> is execute task 29
SIMPLE_THREAD_POOL-11 ==> is execute task 31
SIMPLE_THREAD_POOL-2 ==> is execute task 33
SIMPLE_THREAD_POOL-4 ==> is execute task 35
SIMPLE_THREAD_POOL-1 ==> is execute task 34
SIMPLE_THREAD_POOL-3 ==> is execute task 36
SIMPLE_THREAD_POOL-0 ==> is execute task 32
Min:4,Active:8,Max:12,TaskSize:3,CurrentTaskExecutors:12
SIMPLE_THREAD_POOL-7 ==> is execute task 38
SIMPLE_THREAD_POOL-9 ==> is execute task 39
SIMPLE_THREAD_POOL-5 ==> is execute task 37
--------reduce----------
--------reduce----------
--------reduce----------
--------reduce----------
Min:4,Active:8,Max:12,TaskSize:0,CurrentTaskExecutors:8
all threads are dead.
Process finished with exit code 0
可以看出,当任务数量增加或者减少时,线程池的线程数量也会动态调整