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

来源:互联网 发布:软件问题报告模板 编辑:程序博客网 时间:2024/05/18 03:47

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

    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:4toBeCreated 1 4SIMPLE_THREAD_POOL-0 ==> is execute  task 3SIMPLE_THREAD_POOL-2 ==> is execute  task 1SIMPLE_THREAD_POOL-3 ==> is execute  task 0SIMPLE_THREAD_POOL-4 ==> is execute  task 4SIMPLE_THREAD_POOL-1 ==> is execute  task 2SIMPLE_THREAD_POOL-5 ==> is execute  task 5SIMPLE_THREAD_POOL-6 ==> is execute  task 6SIMPLE_THREAD_POOL-7 ==> is execute  task 7SIMPLE_THREAD_POOL-0 ==> is execute  task 8SIMPLE_THREAD_POOL-1 ==> is execute  task 12SIMPLE_THREAD_POOL-4 ==> is execute  task 11SIMPLE_THREAD_POOL-2 ==> is execute  task 9SIMPLE_THREAD_POOL-3 ==> is execute  task 10Min:4,Active:8,Max:12,TaskSize:26,CurrentTaskExecutors:8SIMPLE_THREAD_POOL-6 ==> is execute  task 13SIMPLE_THREAD_POOL-5 ==> is execute  task 14SIMPLE_THREAD_POOL-7 ==> is execute  task 15SIMPLE_THREAD_POOL-8 ==> is execute  task 16SIMPLE_THREAD_POOL-9 ==> is execute  task 17SIMPLE_THREAD_POOL-10 ==> is execute  task 18SIMPLE_THREAD_POOL-11 ==> is execute  task 19SIMPLE_THREAD_POOL-0 ==> is execute  task 20SIMPLE_THREAD_POOL-2 ==> is execute  task 23SIMPLE_THREAD_POOL-1 ==> is execute  task 21SIMPLE_THREAD_POOL-4 ==> is execute  task 22SIMPLE_THREAD_POOL-3 ==> is execute  task 24SIMPLE_THREAD_POOL-6 ==> is execute  task 25SIMPLE_THREAD_POOL-10 ==> is execute  task 30SIMPLE_THREAD_POOL-7 ==> is execute  task 27SIMPLE_THREAD_POOL-5 ==> is execute  task 26SIMPLE_THREAD_POOL-9 ==> is execute  task 28Min:4,Active:8,Max:12,TaskSize:11,CurrentTaskExecutors:12SIMPLE_THREAD_POOL-8 ==> is execute  task 29SIMPLE_THREAD_POOL-11 ==> is execute  task 31SIMPLE_THREAD_POOL-2 ==> is execute  task 33SIMPLE_THREAD_POOL-4 ==> is execute  task 35SIMPLE_THREAD_POOL-1 ==> is execute  task 34SIMPLE_THREAD_POOL-3 ==> is execute  task 36SIMPLE_THREAD_POOL-0 ==> is execute  task 32Min:4,Active:8,Max:12,TaskSize:3,CurrentTaskExecutors:12SIMPLE_THREAD_POOL-7 ==> is execute  task 38SIMPLE_THREAD_POOL-9 ==> is execute  task 39SIMPLE_THREAD_POOL-5 ==> is execute  task 37--------reduce------------------reduce------------------reduce------------------reduce----------Min:4,Active:8,Max:12,TaskSize:0,CurrentTaskExecutors:8all threads are dead.Process finished with exit code 0

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

阅读全文
0 0
原创粉丝点击