自己动手,写一个简单的线程池(3)

接上篇
为了更好的利用资源,线程池需要动态调整线程数量。
首先,定义好最小线程,活跃线程,最大线程数量

    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

可以看出,当任务数量增加或者减少时,线程池的线程数量也会动态调整

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值