java线程池newFixedThreadPool详解

java线程池Executors.newFixedThreadPool(int nThread)很多人都用过,但可能不一定看过里面的实现,这几天刚好去面试,这个东西基本也就是个必问题了,这下顺便整理一下,至于面试的结果,先就按下不表了。
使用方法
ExecutorService service = Executors.newFixedThreadPool(3);
for (int i = 0 ; i < 4 ;i ++) {
    int  j = i;
    service.execute(new Runnable() {            
                @Override
                public void run() {
                    try {
                        Thread.sleep(10000);
                        System.out.println("test" + j);
                    } catch (Exception e) {
                    }

                }
            });
        }

newFixedThreadPool(int nThread)必须指定线程池的大小,线程池没有默认值,而newCachedThreadPool()是不需要设置线程池大小,默认就是Integer.MAX。
newFixedThreadPool()用的是LinkedBlockingQueue,但由于newFixedThreadPool()是必须设置线程池大小的,所以LinkedBlockingQueue是有界的。
其实newFixedThreadPool()在严格上说并不会复用线程,每运行一个Runnable都会通过ThreadFactory创建一个线程。

ThreadPoolExecutor.execute(Runnable command)

        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }

如果运行中的线程小于线程池大小,就直接创建进程执行。

        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);

如果正在执行中的线程大于线程池的大小,就会执行上述代码,把Runnable放入wokrQueuue,就是LinkBlockingQueue。

ThreadPoolExecutor.getTask()

try {
    Runnable r = timed ? workQueue.poll(keepAliveTime,TimeUnit.NANOSECONDS) :
workQueue.take();
    if (r != null)
        return r;
        timedOut = true;
    } catch (InterruptedException retry) {
                timedOut = false;
    }

取出Runnable,执行线程。

以后会再谈一下Woker的使用。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值