栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面试:线程池

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面试:线程池

线程池的状态

1 RUNNING = ‐1 << COUNT_BITS; //高3位为111
2 SHUTDOWN = 0 << COUNT_BITS; //高3位为000
3 STOP = 1 << COUNT_BITS; //高3位为001
4 TIDYING = 2 << COUNT_BITS; //高3位为010
5 TERMINATED = 3 << COUNT_BITS; //高3位为011

线程池的具体实现
  1. ThreadPoolExecutor
public ThreadPoolExecutor(
	int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler) 
  • corePoolSize 核心线程数
    当提交一个任务时,则创建一个线程,直到当前线程数等于corePoolSize,如果当前执行的线程数等于corePoolSize,继续提交任务,则任务会被封装成一个Worker对象放入到阻塞队列中
  • maximumPoolSize 最大线程数
    如果阻塞队列满了,还在继续提交任务则会创建新的线程去执行任务,直到线程数等于最大线程数
  • keepAlivetime
    线程池维护线程所允许的空闲时间
  • unit
    时间单位
  • workQueue
    用来保存等待被执行的任务的阻塞队列,且任务必须实现Runnable接口
  • threadFactory
    用来创建新线程,默认使用Executors.defaultThreadFactory来创建线程
  • handler
    • AbortPolicy 抛出异常(默认策略)
    • CallerRunsPolicy 让调用者所在线程执行任务
    • DiscardOldestPolicy 丢弃阻塞队列中最靠前的任务,并执行当前任务
    • DiscardPolicy 直接丢弃
public void execute(Runnable command) {
        if (command == null) throw new NullPointerException();
        
        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);
    }

private Runnable getTask() {
        boolean timedOut = false; // Did the last poll() time out?
        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);
            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
                decrementWorkerCount();
                return null;
            }
            int wc = workerCountOf(c);

            // Are workers subject to culling?
            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

            if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                if (compareAndDecrementWorkerCount(c))
                    return null;
                continue;
            }
            try {
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/284991.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号