Executor

ThreadPoolExecutor

代码

executorService.execute(task)   //提交任务
    addWorker()     //创建Worker
        w = new Worker(firstTask);
            Worker(Runnable firstTask) {
                setState(-1);                                           // inhibit interrupts until runWorker
                this.firstTask = firstTask;                             // execute方法提交的任务
                this.thread = getThreadFactory().newThread(this);       // 创建Worker时创建任务的执行载体 线程
            }
        workers.add(w);                                                 // 往set中存放worker
        线程
        w.thread.start();                                               // 启动线程

        w.thread.run()                                                  // 操作系统调度线程执行
            worker.run()
                task.run()

1.1.2 想象画面

线程池 得有个线程工厂源源不断生产线程、有一系列的Workers用于执行任务(用线程去跑任务)、
就像穿手串,有工人(Worker),有线团(ThreadFactory)生产线(Thread)、有珠子(Runnable珠子在run滚哈哈哈哈),
工人会将送过来的珠子 前后加个垫圈穿进线中,run起来

1.1.3 组件分析

1.一个threadFactory 用于创建线程 执行任务
newThread()工厂方法
2.wokers HashSet
Worker实现、依赖 Runnable
包含firstTask(任务)
对任务的包装,提交给线程池任务执行的前后处理 依赖的的Runnable是提交给线程池的
依赖Thread 每个创建一个Thread,执行包装任务
3.workQueue:任务执行前保存任务的队列,仅保存由execute方法提交的Runnable任务。
BlockingQueue 并发集合 生产、消费 由主线程提交任务作为生产
线程池有空闲线程(worker)时执行任务(消费)
if (workerCountOf(c) >= corePoolSize)
workQueue.offer(command) 当达到coreSize之后会将任务放在任务队列里

posted on 2018-12-11 14:38  唠叨叨  阅读(140)  评论(0编辑  收藏  举报