线程池创建过程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 classExcuteTest {public static voidmain(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 implementsRunnable{inti;

Myrun(inti){this.i =i;

}public voidrun() {

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值