zoukankan      html  css  js  c++  java
  • SimpleThreadPool极简版

    package com.dwz.concurrency.chapter13;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * 1.任务队列--调度 2.拒绝策略(抛出异常、直接丢弃、阻塞、临时队列)--性能保护 3.init(min) 4.active 5.max
     * min<=active<=max Quartz/Control-M
     */
    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<>();
    
        public SimpleThreadPool() {
            this(DEFAULT_SIZE);
        }
    
        public SimpleThreadPool(int size) {
            this.size = size;
            init();
        }
    
        private void init() {
            for (int i = 0; i < this.size; i++) {
                createWorkTask();
            }
        }
    
        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();
            THREAD_QUEUE.add(task);
        }
    
        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);
            }
    
            public TaskState getTaskState() {
                return this.taskState;
            }
    
            @Override
            public void run() {
                OUTER: 
                while (this.taskState != TaskState.DEAD) {
                    Runnable runnable = null;
                    synchronized (TASK_QUEUE) {
                        while (TASK_QUEUE.isEmpty()) {
                            try {
                                this.taskState = TaskState.BLOCKED;
                                TASK_QUEUE.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                                // 线程被打断回到OUTER位置
                                break OUTER;
                            }
                        }
                        runnable = TASK_QUEUE.removeFirst();
                    }
                    
                    if (runnable != null) {
                        System.out.println("runnable into...");
                        this.taskState = TaskState.RUNNING;
                        runnable.run();
                        this.taskState = TaskState.FREE;
                    }
                }
            }
    
            public void close() {
                this.taskState = TaskState.DEAD;
            }
        }
    
        public static void main(String[] args) {
            SimpleThreadPool threadPool = new SimpleThreadPool();
    //        IntStream.range(0, 40).forEach(i -> {
    //            threadPool.submit(() -> {
    //                System.out.println("The runnable " + i + " be serviced by " + Thread.currentThread() + " start.");
    //                try {
    //                    Thread.sleep(1000);
    //                } catch (InterruptedException e) {
    //                    e.printStackTrace();
    //                }
    //                System.out.println("The runnable " + i + " be serviced by " + Thread.currentThread() + " finished.");
    //            });
    //        });
            for(int i = 0; i < 40; i++) {
                threadPool.submit(() -> {
                    System.out.println("The runnable be serviced by " + Thread.currentThread() + " start.");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("The runnable be serviced by " + Thread.currentThread() + " finished.");
                });
            }
        }
    }

    该线程池只创建了默认的线程数量,不包含拒绝策略,线程池的打断、销毁和自动扩展线程数量,只保持了线程的最低性能,只是极简版,之后的文章会慢慢扩展

    可参考文章:

    https://blog.csdn.net/const_/article/details/89317907

  • 相关阅读:
    apache开启.htaccess及.htaccess的使用方法
    如何解决PHP startup: Unable to load dynamic library './php_mysql.dll 找不到指定的模块
    html判断IE版本
    php.ini 配置详解
    检测apache是否支持htaccess文件
    MySql my.ini 中文详细说明
    "安装SQL2005时出现“以前的某个程序安装在计算机上创建挂起文件操作,运行安装程序之前必须重新启动计算机
    iOS开发笔记-两种单例模式的写法
    SQL 2005此计算机上已经安装了同名实例
    win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
  • 原文地址:https://www.cnblogs.com/zheaven/p/12085063.html
Copyright © 2011-2022 走看看