zoukankan      html  css  js  c++  java
  • java线程池执行过程

    java的线程池通过  AtomicInteger  即原子整型来控制线程池的执行过程,其中前 3 位表示线程池的状态,后 29 位表示该线程池的最大线程数,具体如下:

    RUNNING

      111  0~0

      该状态接收新任务,并处理 workQueue 中的任务

    SHUTDOWN

      000  0~0

      收尾,不接受新任务,但是处理掉 workQueue中的任务

    STOP

      001  0~0

      既不接收新任务,也不处理 workQueue 中的任务,同时执行中的任务马上中断

    TIDYING

      010  0~0

      所有的任务结束,workercount 是0,进入该状态的线程会执行 terminated() 方法

    TERMINATED

      011  0~0

      terminated() 执行完后进入该状态

    线程池是异步执行模式

      execute()  异步

      submit()    可异步,可同步

            同步:pool.submit(new Myrun(4)).get();

    考察过程的代码如下:

    public class ExcuteTest {
        public static void main(String[] args) {
            ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
            pool.execute(new Myrun(1));
            pool.execute(new Myrun(2));
            pool.execute(new Myrun(3));
            pool.execute(new Myrun(4));
            pool.shutdown();
        }
        static class Myrun implements Runnable{
            int i;
            Myrun(int i){
                this.i = i;
            }
            public void run() {
                System.out.println(Thread.currentThread().getName() + " : " + i);
            }
        }
    }

    执行并进入pool.execute( r ) 方法

    ----------------------------------------------------------------------

    首先判断:worker数 < corepoolsize   即当前的 worker 数是否小于传入的最大线程数

    有两种情况:

    case 1:true

    执行并进入 addworker( r )   即把 r 添加到 workers 中

      1、首先创建worker对象 w ,包含:

          firstTask:即 r 对象

          thread

      2、worker.add( w)

      3、t.start()  即启动 worker 分线程,运行 runworker( w ) 方法

        注:该线程池最终的线程数即为 worker 数

    执行并进入 runworker( w ) 中

      首先,取出初始任务,task = w.firstTask

      进入任务执行循环中,并传入task

      --------------------------------------------------------

      |    while( task != null || ( task=getTask()) != null )) {    注:getTask() 从 workQueue 中取出任务:workQueue.take()

      |    task.run();  即执行自定义的 run() 方法

      |    }

    case 2:false

    workerQueue.offer( r ) 把新增的任务即 Runnable 对象添加到 workQueue 中即 BlockingQueue, 通过 getTask() 获取任务并执行

    其他:

      若没有 pool.shutdown(); 则会在 workQueue.take() 阻塞,直到有元素可取.

    渐变 --> 突变
  • 相关阅读:
    05.迪米特原则 (LOD)
    04.接口隔离原则 (ISP)
    03.依赖倒置原则 (DIP)
    02.里氏替换原则 (LSP)
    01.单一职责原则 (SRP)
    Flutter点击事件的穿透,父元素点击事件覆盖了子元素点击的问题
    flutter dart语法判断 0/0==Nan 1/0==Infinity的问题
    vue项目引入三方字体
    vue echart图表打包后 图片不显示
    vue设置页面的高度100%
  • 原文地址:https://www.cnblogs.com/lybpy/p/9615343.html
Copyright © 2011-2022 走看看