java线程池执行过程

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

RUNNING

  111  0~0

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

SHUTDOWN

  000  0~0

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

STOP

  001  0~0

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

TIDYING

扫描二维码关注公众号,回复: 3101514 查看本文章

  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() 阻塞,直到有元素可取.

猜你喜欢

转载自www.cnblogs.com/lybpy/p/9615343.html