java 中线程池的种类,原理以及源码解析(1)

java 中的线程池创建都是Executors 类中提供的方法,并且方法返回线程池对象。

Executors 源码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package java.util.concurrent;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadPoolExecutor extends AbstractExecutorService {
    private final AtomicInteger ctl;
    private static final int COUNT_BITS = 29;
    private static final int CAPACITY = 536870911;
    private static final int RUNNING = -536870912;
    private static final int SHUTDOWN = 0;
    private static final int STOP = 536870912;
    private static final int TIDYING = 1073741824;
    private static final int TERMINATED = 1610612736;
    private final BlockingQueue<Runnable> workQueue;
    private final ReentrantLock mainLock;
    private final HashSet<ThreadPoolExecutor.Worker> workers;
    private final Condition termination;
    private int largestPoolSize;
    private long completedTaskCount;
    private volatile ThreadFactory threadFactory;
    private volatile RejectedExecutionHandler handler;
    private volatile long keepAliveTime;
    private volatile boolean allowCoreThreadTimeOut;
    private volatile int corePoolSize;
    private volatile int maximumPoolSize;
    private static final RejectedExecutionHandler defaultHandler = new ThreadPoolExecutor.AbortPolicy();
    private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");
    private static final boolean ONLY_ONE = true;

    private static int runStateOf(int var0) {
        return var0 & -536870912;
    }

    private static int workerCountOf(int var0) {
        return var0 & 536870911;
    }

    private static int ctlOf(int var0, int var1) {
        return var0 | var1;
    }

    private static boolean runStateLessThan(int var0, int var1) {
        return var0 < var1;
    }

    private static boolean runStateAtLeast(int var0, int var1) {
        return var0 >= var1;
    }

    private static boolean isRunning(int var0) {
        return var0 < 0;
    }

    private boolean compareAndIncrementWorkerCount(int var1) {
        return this.ctl.compareAndSet(var1, var1 + 1);
    }

    private boolean compareAndDecrementWorkerCount(int var1) {
        return this.ctl.compareAndSet(var1, var1 - 1);
    }

    private void decrementWorkerCount() {
        while(!this.compareAndDecrementWorkerCount(this.ctl.get())) {
            ;
        }

    }

    private void advanceRunState(int var1) {
        int var2;
        do {
            var2 = this.ctl.get();
        } while(!runStateAtLeast(var2, var1) && !this.ctl.compareAndSet(var2, ctlOf(var1, workerCountOf(var2))));

    }

    final void tryTerminate() {
        while(true) {
            int var1 = this.ctl.get();
            if (isRunning(var1) || runStateAtLeast(var1, 1073741824) || runStateOf(var1) == 0 && !this.workQueue.isEmpty()) {
                return;
            }

            if (workerCountOf(var1) != 0) {
                this.interruptIdleWorkers(true);
                return;
            }

            ReentrantLock var2 = this.mainLock;
            var2.lock();

            try {
                if (!this.ctl.compareAndSet(var1, ctlOf(1073741824, 0))) {
                    continue;
                }

                try {
                    this.terminated();
                } finally {
                    this.ctl.set(ctlOf(1610612736, 0));
                    this.termination.signalAll();
                }
            } finally {
                var2.unlock();
            }

            return;
        }
    }

    private void checkShutdownAccess() {
        SecurityManager var1 = System.getSecurityManager();
        if (var1 != null) {
            var1.checkPermission(shutdownPerm);
            ReentrantLock var2 = this.mainLock;
            var2.lock();

            try {
                Iterator var3 = this.workers.iterator();

                while(var3.hasNext()) {
                    ThreadPoolExecutor.Worker var4 = (ThreadPoolExecutor.Worker)var3.next();
                    var1.checkAccess(var4.thread);
                }
            } finally {
                var2.unlock();
            }
        }

    }

    private void interruptWorkers() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            Iterator var2 = this.workers.iterator();

            while(var2.hasNext()) {
                ThreadPoolExecutor.Worker var3 = (ThreadPoolExecutor.Worker)var2.next();
                var3.interruptIfStarted();
            }
        } finally {
            var1.unlock();
        }

    }

    private void interruptIdleWorkers(boolean var1) {
        ReentrantLock var2 = this.mainLock;
        var2.lock();

        try {
            Iterator var3 = this.workers.iterator();

            while(var3.hasNext()) {
                ThreadPoolExecutor.Worker var4 = (ThreadPoolExecutor.Worker)var3.next();
                Thread var5 = var4.thread;
                if (!var5.isInterrupted() && var4.tryLock()) {
                    try {
                        var5.interrupt();
                    } catch (SecurityException var15) {
                        ;
                    } finally {
                        var4.unlock();
                    }
                }

                if (var1) {
                    break;
                }
            }
        } finally {
            var2.unlock();
        }

    }

    private void interruptIdleWorkers() {
        this.interruptIdleWorkers(false);
    }

    final void reject(Runnable var1) {
        this.handler.rejectedExecution(var1, this);
    }

    void onShutdown() {
    }

    final boolean isRunningOrShutdown(boolean var1) {
        int var2 = runStateOf(this.ctl.get());
        return var2 == -536870912 || var2 == 0 && var1;
    }

    private List<Runnable> drainQueue() {
        BlockingQueue var1 = this.workQueue;
        ArrayList var2 = new ArrayList();
        var1.drainTo(var2);
        if (!var1.isEmpty()) {
            Runnable[] var3 = (Runnable[])var1.toArray(new Runnable[0]);
            int var4 = var3.length;

            for(int var5 = 0; var5 < var4; ++var5) {
                Runnable var6 = var3[var5];
                if (var1.remove(var6)) {
                    var2.add(var6);
                }
            }
        }

        return var2;
    }

    private boolean addWorker(Runnable var1, boolean var2) {
        while(true) {
            int var3 = this.ctl.get();
            int var4 = runStateOf(var3);
            if (var4 >= 0 && (var4 != 0 || var1 != null || this.workQueue.isEmpty())) {
                return false;
            }

            while(true) {
                int var5 = workerCountOf(var3);
                if (var5 >= 536870911 || var5 >= (var2 ? this.corePoolSize : this.maximumPoolSize)) {
                    return false;
                }

                if (this.compareAndIncrementWorkerCount(var3)) {
                    boolean var18 = false;
                    boolean var19 = false;
                    ThreadPoolExecutor.Worker var20 = null;

                    try {
                        var20 = new ThreadPoolExecutor.Worker(var1);
                        Thread var6 = var20.thread;
                        if (var6 != null) {
                            ReentrantLock var7 = this.mainLock;
                            var7.lock();

                            try {
                                int var8 = runStateOf(this.ctl.get());
                                if (var8 < 0 || var8 == 0 && var1 == null) {
                                    if (var6.isAlive()) {
                                        throw new IllegalThreadStateException();
                                    }

                                    this.workers.add(var20);
                                    int var9 = this.workers.size();
                                    if (var9 > this.largestPoolSize) {
                                        this.largestPoolSize = var9;
                                    }

                                    var19 = true;
                                }
                            } finally {
                                var7.unlock();
                            }

                            if (var19) {
                                var6.start();
                                var18 = true;
                            }
                        }
                    } finally {
                        if (!var18) {
                            this.addWorkerFailed(var20);
                        }

                    }

                    return var18;
                }

                var3 = this.ctl.get();
                if (runStateOf(var3) != var4) {
                    break;
                }
            }
        }
    }

    private void addWorkerFailed(ThreadPoolExecutor.Worker var1) {
        ReentrantLock var2 = this.mainLock;
        var2.lock();

        try {
            if (var1 != null) {
                this.workers.remove(var1);
            }

            this.decrementWorkerCount();
            this.tryTerminate();
        } finally {
            var2.unlock();
        }

    }

    private void processWorkerExit(ThreadPoolExecutor.Worker var1, boolean var2) {
        if (var2) {
            this.decrementWorkerCount();
        }

        ReentrantLock var3 = this.mainLock;
        var3.lock();

        try {
            this.completedTaskCount += var1.completedTasks;
            this.workers.remove(var1);
        } finally {
            var3.unlock();
        }

        this.tryTerminate();
        int var4 = this.ctl.get();
        if (runStateLessThan(var4, 536870912)) {
            if (!var2) {
                int var5 = this.allowCoreThreadTimeOut ? 0 : this.corePoolSize;
                if (var5 == 0 && !this.workQueue.isEmpty()) {
                    var5 = 1;
                }

                if (workerCountOf(var4) >= var5) {
                    return;
                }
            }

            this.addWorker((Runnable)null, false);
        }

    }

    private Runnable getTask() {
        boolean var1 = false;

        while(true) {
            int var2 = this.ctl.get();
            int var3 = runStateOf(var2);
            if (var3 >= 0 && (var3 >= 536870912 || this.workQueue.isEmpty())) {
                this.decrementWorkerCount();
                return null;
            }

            int var4 = workerCountOf(var2);
            boolean var5 = this.allowCoreThreadTimeOut || var4 > this.corePoolSize;
            if (var4 <= this.maximumPoolSize && (!var5 || !var1) || var4 <= 1 && !this.workQueue.isEmpty()) {
                try {
                    Runnable var6 = var5 ? (Runnable)this.workQueue.poll(this.keepAliveTime, TimeUnit.NANOSECONDS) : (Runnable)this.workQueue.take();
                    if (var6 != null) {
                        return var6;
                    }

                    var1 = true;
                } catch (InterruptedException var7) {
                    var1 = false;
                }
            } else if (this.compareAndDecrementWorkerCount(var2)) {
                return null;
            }
        }
    }

    final void runWorker(ThreadPoolExecutor.Worker var1) {
        Thread var2 = Thread.currentThread();
        Runnable var3 = var1.firstTask;
        var1.firstTask = null;
        var1.unlock();
        boolean var4 = true;

        try {
            while(var3 != null || (var3 = this.getTask()) != null) {
                var1.lock();
                if ((runStateAtLeast(this.ctl.get(), 536870912) || Thread.interrupted() && runStateAtLeast(this.ctl.get(), 536870912)) && !var2.isInterrupted()) {
                    var2.interrupt();
                }

                try {
                    this.beforeExecute(var2, var3);
                    Object var5 = null;

                    try {
                        var3.run();
                    } catch (RuntimeException var28) {
                        var5 = var28;
                        throw var28;
                    } catch (Error var29) {
                        var5 = var29;
                        throw var29;
                    } catch (Throwable var30) {
                        var5 = var30;
                        throw new Error(var30);
                    } finally {
                        this.afterExecute(var3, (Throwable)var5);
                    }
                } finally {
                    var3 = null;
                    ++var1.completedTasks;
                    var1.unlock();
                }
            }

            var4 = false;
        } finally {
            this.processWorkerExit(var1, var4);
        }

    }

    public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6) {
        this(var1, var2, var3, var5, var6, Executors.defaultThreadFactory(), defaultHandler);
    }

    public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6, ThreadFactory var7) {
        this(var1, var2, var3, var5, var6, var7, defaultHandler);
    }

    public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6, RejectedExecutionHandler var7) {
        this(var1, var2, var3, var5, var6, Executors.defaultThreadFactory(), var7);
    }

    public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6, ThreadFactory var7, RejectedExecutionHandler var8) {
        this.ctl = new AtomicInteger(ctlOf(-536870912, 0));
        this.mainLock = new ReentrantLock();
        this.workers = new HashSet();
        this.termination = this.mainLock.newCondition();
        if (var1 >= 0 && var2 > 0 && var2 >= var1 && var3 >= 0L) {
            if (var6 != null && var7 != null && var8 != null) {
                this.corePoolSize = var1;
                this.maximumPoolSize = var2;
                this.workQueue = var6;
                this.keepAliveTime = var5.toNanos(var3);
                this.threadFactory = var7;
                this.handler = var8;
            } else {
                throw new NullPointerException();
            }
        } else {
            throw new IllegalArgumentException();
        }
    }

    public void execute(Runnable var1) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            int var2 = this.ctl.get();
            if (workerCountOf(var2) < this.corePoolSize) {
                if (this.addWorker(var1, true)) {
                    return;
                }

                var2 = this.ctl.get();
            }

            if (isRunning(var2) && this.workQueue.offer(var1)) {
                int var3 = this.ctl.get();
                if (!isRunning(var3) && this.remove(var1)) {
                    this.reject(var1);
                } else if (workerCountOf(var3) == 0) {
                    this.addWorker((Runnable)null, false);
                }
            } else if (!this.addWorker(var1, false)) {
                this.reject(var1);
            }

        }
    }

    public void shutdown() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            this.checkShutdownAccess();
            this.advanceRunState(0);
            this.interruptIdleWorkers();
            this.onShutdown();
        } finally {
            var1.unlock();
        }

        this.tryTerminate();
    }

    public List<Runnable> shutdownNow() {
        ReentrantLock var2 = this.mainLock;
        var2.lock();

        List var1;
        try {
            this.checkShutdownAccess();
            this.advanceRunState(536870912);
            this.interruptWorkers();
            var1 = this.drainQueue();
        } finally {
            var2.unlock();
        }

        this.tryTerminate();
        return var1;
    }

    public boolean isShutdown() {
        return !isRunning(this.ctl.get());
    }

    public boolean isTerminating() {
        int var1 = this.ctl.get();
        return !isRunning(var1) && runStateLessThan(var1, 1610612736);
    }

    public boolean isTerminated() {
        return runStateAtLeast(this.ctl.get(), 1610612736);
    }

    public boolean awaitTermination(long var1, TimeUnit var3) throws InterruptedException {
        long var4 = var3.toNanos(var1);
        ReentrantLock var6 = this.mainLock;
        var6.lock();

        boolean var7;
        try {
            while(!runStateAtLeast(this.ctl.get(), 1610612736)) {
                if (var4 <= 0L) {
                    var7 = false;
                    return var7;
                }

                var4 = this.termination.awaitNanos(var4);
            }

            var7 = true;
        } finally {
            var6.unlock();
        }

        return var7;
    }

    protected void finalize() {
        this.shutdown();
    }

    public void setThreadFactory(ThreadFactory var1) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            this.threadFactory = var1;
        }
    }

    public ThreadFactory getThreadFactory() {
        return this.threadFactory;
    }

    public void setRejectedExecutionHandler(RejectedExecutionHandler var1) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            this.handler = var1;
        }
    }

    public RejectedExecutionHandler getRejectedExecutionHandler() {
        return this.handler;
    }

    public void setCorePoolSize(int var1) {
        if (var1 < 0) {
            throw new IllegalArgumentException();
        } else {
            int var2 = var1 - this.corePoolSize;
            this.corePoolSize = var1;
            if (workerCountOf(this.ctl.get()) > var1) {
                this.interruptIdleWorkers();
            } else if (var2 > 0) {
                int var3 = Math.min(var2, this.workQueue.size());

                while(var3-- > 0 && this.addWorker((Runnable)null, true) && !this.workQueue.isEmpty()) {
                    ;
                }
            }

        }
    }

    public int getCorePoolSize() {
        return this.corePoolSize;
    }

    public boolean prestartCoreThread() {
        return workerCountOf(this.ctl.get()) < this.corePoolSize && this.addWorker((Runnable)null, true);
    }

    void ensurePrestart() {
        int var1 = workerCountOf(this.ctl.get());
        if (var1 < this.corePoolSize) {
            this.addWorker((Runnable)null, true);
        } else if (var1 == 0) {
            this.addWorker((Runnable)null, false);
        }

    }

    public int prestartAllCoreThreads() {
        int var1;
        for(var1 = 0; this.addWorker((Runnable)null, true); ++var1) {
            ;
        }

        return var1;
    }

    public boolean allowsCoreThreadTimeOut() {
        return this.allowCoreThreadTimeOut;
    }

    public void allowCoreThreadTimeOut(boolean var1) {
        if (var1 && this.keepAliveTime <= 0L) {
            throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
        } else {
            if (var1 != this.allowCoreThreadTimeOut) {
                this.allowCoreThreadTimeOut = var1;
                if (var1) {
                    this.interruptIdleWorkers();
                }
            }

        }
    }

    public void setMaximumPoolSize(int var1) {
        if (var1 > 0 && var1 >= this.corePoolSize) {
            this.maximumPoolSize = var1;
            if (workerCountOf(this.ctl.get()) > var1) {
                this.interruptIdleWorkers();
            }

        } else {
            throw new IllegalArgumentException();
        }
    }

    public int getMaximumPoolSize() {
        return this.maximumPoolSize;
    }

    public void setKeepAliveTime(long var1, TimeUnit var3) {
        if (var1 < 0L) {
            throw new IllegalArgumentException();
        } else if (var1 == 0L && this.allowsCoreThreadTimeOut()) {
            throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
        } else {
            long var4 = var3.toNanos(var1);
            long var6 = var4 - this.keepAliveTime;
            this.keepAliveTime = var4;
            if (var6 < 0L) {
                this.interruptIdleWorkers();
            }

        }
    }

    public long getKeepAliveTime(TimeUnit var1) {
        return var1.convert(this.keepAliveTime, TimeUnit.NANOSECONDS);
    }

    public BlockingQueue<Runnable> getQueue() {
        return this.workQueue;
    }

    public boolean remove(Runnable var1) {
        boolean var2 = this.workQueue.remove(var1);
        this.tryTerminate();
        return var2;
    }

    public void purge() {
        BlockingQueue var1 = this.workQueue;

        try {
            Iterator var2 = var1.iterator();

            while(var2.hasNext()) {
                Runnable var8 = (Runnable)var2.next();
                if (var8 instanceof Future && ((Future)var8).isCancelled()) {
                    var2.remove();
                }
            }
        } catch (ConcurrentModificationException var7) {
            Object[] var3 = var1.toArray();
            int var4 = var3.length;

            for(int var5 = 0; var5 < var4; ++var5) {
                Object var6 = var3[var5];
                if (var6 instanceof Future && ((Future)var6).isCancelled()) {
                    var1.remove(var6);
                }
            }
        }

        this.tryTerminate();
    }

    public int getPoolSize() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        int var2;
        try {
            var2 = runStateAtLeast(this.ctl.get(), 1073741824) ? 0 : this.workers.size();
        } finally {
            var1.unlock();
        }

        return var2;
    }

    public int getActiveCount() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            int var2 = 0;
            Iterator var3 = this.workers.iterator();

            while(var3.hasNext()) {
                ThreadPoolExecutor.Worker var4 = (ThreadPoolExecutor.Worker)var3.next();
                if (var4.isLocked()) {
                    ++var2;
                }
            }

            int var8 = var2;
            return var8;
        } finally {
            var1.unlock();
        }
    }

    public int getLargestPoolSize() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        int var2;
        try {
            var2 = this.largestPoolSize;
        } finally {
            var1.unlock();
        }

        return var2;
    }

    public long getTaskCount() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            long var2 = this.completedTaskCount;
            Iterator var4 = this.workers.iterator();

            while(var4.hasNext()) {
                ThreadPoolExecutor.Worker var5 = (ThreadPoolExecutor.Worker)var4.next();
                var2 += var5.completedTasks;
                if (var5.isLocked()) {
                    ++var2;
                }
            }

            long var9 = var2 + (long)this.workQueue.size();
            return var9;
        } finally {
            var1.unlock();
        }
    }

    public long getCompletedTaskCount() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            long var2 = this.completedTaskCount;

            ThreadPoolExecutor.Worker var5;
            for(Iterator var4 = this.workers.iterator(); var4.hasNext(); var2 += var5.completedTasks) {
                var5 = (ThreadPoolExecutor.Worker)var4.next();
            }

            long var9 = var2;
            return var9;
        } finally {
            var1.unlock();
        }
    }

    public String toString() {
        ReentrantLock var5 = this.mainLock;
        var5.lock();

        long var1;
        int var3;
        int var4;
        try {
            var1 = this.completedTaskCount;
            var4 = 0;
            var3 = this.workers.size();
            Iterator var6 = this.workers.iterator();

            while(var6.hasNext()) {
                ThreadPoolExecutor.Worker var7 = (ThreadPoolExecutor.Worker)var6.next();
                var1 += var7.completedTasks;
                if (var7.isLocked()) {
                    ++var4;
                }
            }
        } finally {
            var5.unlock();
        }

        int var11 = this.ctl.get();
        String var12 = runStateLessThan(var11, 0) ? "Running" : (runStateAtLeast(var11, 1610612736) ? "Terminated" : "Shutting down");
        return super.toString() + "[" + var12 + ", pool size = " + var3 + ", active threads = " + var4 + ", queued tasks = " + this.workQueue.size() + ", completed tasks = " + var1 + "]";
    }

    protected void beforeExecute(Thread var1, Runnable var2) {
    }

    protected void afterExecute(Runnable var1, Throwable var2) {
    }

    protected void terminated() {
    }

    public static class AbortPolicy implements RejectedExecutionHandler {
        public AbortPolicy() {
        }

        public void rejectedExecution(Runnable var1, ThreadPoolExecutor var2) {
            throw new RejectedExecutionException("Task " + var1.toString() + " rejected from " + var2.toString());
        }
    }

    public static class CallerRunsPolicy implements RejectedExecutionHandler {
        public CallerRunsPolicy() {
        }

        public void rejectedExecution(Runnable var1, ThreadPoolExecutor var2) {
            if (!var2.isShutdown()) {
                var1.run();
            }

        }
    }

    public static class DiscardOldestPolicy implements RejectedExecutionHandler {
        public DiscardOldestPolicy() {
        }

        public void rejectedExecution(Runnable var1, ThreadPoolExecutor var2) {
            if (!var2.isShutdown()) {
                var2.getQueue().poll();
                var2.execute(var1);
            }

        }
    }

    public static class DiscardPolicy implements RejectedExecutionHandler {
        public DiscardPolicy() {
        }

        public void rejectedExecution(Runnable var1, ThreadPoolExecutor var2) {
        }
    }

    private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
        private static final long serialVersionUID = 6138294804551838833L;
        final Thread thread;
        Runnable firstTask;
        volatile long completedTasks;

        Worker(Runnable var2) {
            this.setState(-1);
            this.firstTask = var2;
            this.thread = ThreadPoolExecutor.this.getThreadFactory().newThread(this);
        }

        public void run() {
            ThreadPoolExecutor.this.runWorker(this);
        }

        protected boolean isHeldExclusively() {
            return this.getState() != 0;
        }

        protected boolean tryAcquire(int var1) {
            if (this.compareAndSetState(0, 1)) {
                this.setExclusiveOwnerThread(Thread.currentThread());
                return true;
            } else {
                return false;
            }
        }

        protected boolean tryRelease(int var1) {
            this.setExclusiveOwnerThread((Thread)null);
            this.setState(0);
            return true;
        }

        public void lock() {
            this.acquire(1);
        }

        public boolean tryLock() {
            return this.tryAcquire(1);
        }

        public void unlock() {
            this.release(1);
        }

        public boolean isLocked() {
            return this.isHeldExclusively();
        }

        void interruptIfStarted() {
            if (this.getState() >= 0) {
                Thread var1 = this.thread;
                if (this.thread != null && !var1.isInterrupted()) {
                    try {
                        var1.interrupt();
                    } catch (SecurityException var3) {
                        ;
                    }
                }
            }

        }
    }
}

newFixedThreadPool -> ThreadPoolExecutor
newSingleThreadExecutor -> FinalizableDelegatedExecutorService
newCachedThreadPool -> ThreadPoolExecutor
newSingleThreadScheduledExecutor -> DelegatedScheduledExecutorService
newScheduledThreadPool -> ScheduledThreadPoolExecutor
newWorkStealingPool -> ForkJoinPool

ThreadPoolExecutor 是创建创建线程池公共类也是核心类,不同的线程池其实就是参数传值不同。

ThreadPoolExecutor -> AbstractExecutorService -> ExecutorService -> Executor

ThreadPoolExecutor源码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package java.util.concurrent;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadPoolExecutor extends AbstractExecutorService {
    private final AtomicInteger ctl;
    private static final int COUNT_BITS = 29;
    private static final int CAPACITY = 536870911;
    private static final int RUNNING = -536870912;
    private static final int SHUTDOWN = 0;
    private static final int STOP = 536870912;
    private static final int TIDYING = 1073741824;
    private static final int TERMINATED = 1610612736;
    private final BlockingQueue<Runnable> workQueue;
    private final ReentrantLock mainLock;
    private final HashSet<ThreadPoolExecutor.Worker> workers;
    private final Condition termination;
    private int largestPoolSize;
    private long completedTaskCount;
    private volatile ThreadFactory threadFactory;
    private volatile RejectedExecutionHandler handler;
    private volatile long keepAliveTime;
    private volatile boolean allowCoreThreadTimeOut;
    private volatile int corePoolSize;
    private volatile int maximumPoolSize;
    private static final RejectedExecutionHandler defaultHandler = new ThreadPoolExecutor.AbortPolicy();
    private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");
    private static final boolean ONLY_ONE = true;

    private static int runStateOf(int var0) {
        return var0 & -536870912;
    }

    private static int workerCountOf(int var0) {
        return var0 & 536870911;
    }

    private static int ctlOf(int var0, int var1) {
        return var0 | var1;
    }

    private static boolean runStateLessThan(int var0, int var1) {
        return var0 < var1;
    }

    private static boolean runStateAtLeast(int var0, int var1) {
        return var0 >= var1;
    }

    private static boolean isRunning(int var0) {
        return var0 < 0;
    }

    private boolean compareAndIncrementWorkerCount(int var1) {
        return this.ctl.compareAndSet(var1, var1 + 1);
    }

    private boolean compareAndDecrementWorkerCount(int var1) {
        return this.ctl.compareAndSet(var1, var1 - 1);
    }

    private void decrementWorkerCount() {
        while(!this.compareAndDecrementWorkerCount(this.ctl.get())) {
            ;
        }

    }

    private void advanceRunState(int var1) {
        int var2;
        do {
            var2 = this.ctl.get();
        } while(!runStateAtLeast(var2, var1) && !this.ctl.compareAndSet(var2, ctlOf(var1, workerCountOf(var2))));

    }

    final void tryTerminate() {
        while(true) {
            int var1 = this.ctl.get();
            if (isRunning(var1) || runStateAtLeast(var1, 1073741824) || runStateOf(var1) == 0 && !this.workQueue.isEmpty()) {
                return;
            }

            if (workerCountOf(var1) != 0) {
                this.interruptIdleWorkers(true);
                return;
            }

            ReentrantLock var2 = this.mainLock;
            var2.lock();

            try {
                if (!this.ctl.compareAndSet(var1, ctlOf(1073741824, 0))) {
                    continue;
                }

                try {
                    this.terminated();
                } finally {
                    this.ctl.set(ctlOf(1610612736, 0));
                    this.termination.signalAll();
                }
            } finally {
                var2.unlock();
            }

            return;
        }
    }

    private void checkShutdownAccess() {
        SecurityManager var1 = System.getSecurityManager();
        if (var1 != null) {
            var1.checkPermission(shutdownPerm);
            ReentrantLock var2 = this.mainLock;
            var2.lock();

            try {
                Iterator var3 = this.workers.iterator();

                while(var3.hasNext()) {
                    ThreadPoolExecutor.Worker var4 = (ThreadPoolExecutor.Worker)var3.next();
                    var1.checkAccess(var4.thread);
                }
            } finally {
                var2.unlock();
            }
        }

    }

    private void interruptWorkers() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            Iterator var2 = this.workers.iterator();

            while(var2.hasNext()) {
                ThreadPoolExecutor.Worker var3 = (ThreadPoolExecutor.Worker)var2.next();
                var3.interruptIfStarted();
            }
        } finally {
            var1.unlock();
        }

    }

    private void interruptIdleWorkers(boolean var1) {
        ReentrantLock var2 = this.mainLock;
        var2.lock();

        try {
            Iterator var3 = this.workers.iterator();

            while(var3.hasNext()) {
                ThreadPoolExecutor.Worker var4 = (ThreadPoolExecutor.Worker)var3.next();
                Thread var5 = var4.thread;
                if (!var5.isInterrupted() && var4.tryLock()) {
                    try {
                        var5.interrupt();
                    } catch (SecurityException var15) {
                        ;
                    } finally {
                        var4.unlock();
                    }
                }

                if (var1) {
                    break;
                }
            }
        } finally {
            var2.unlock();
        }

    }

    private void interruptIdleWorkers() {
        this.interruptIdleWorkers(false);
    }

    final void reject(Runnable var1) {
        this.handler.rejectedExecution(var1, this);
    }

    void onShutdown() {
    }

    final boolean isRunningOrShutdown(boolean var1) {
        int var2 = runStateOf(this.ctl.get());
        return var2 == -536870912 || var2 == 0 && var1;
    }

    private List<Runnable> drainQueue() {
        BlockingQueue var1 = this.workQueue;
        ArrayList var2 = new ArrayList();
        var1.drainTo(var2);
        if (!var1.isEmpty()) {
            Runnable[] var3 = (Runnable[])var1.toArray(new Runnable[0]);
            int var4 = var3.length;

            for(int var5 = 0; var5 < var4; ++var5) {
                Runnable var6 = var3[var5];
                if (var1.remove(var6)) {
                    var2.add(var6);
                }
            }
        }

        return var2;
    }

    private boolean addWorker(Runnable var1, boolean var2) {
        while(true) {
            int var3 = this.ctl.get();
            int var4 = runStateOf(var3);
            if (var4 >= 0 && (var4 != 0 || var1 != null || this.workQueue.isEmpty())) {
                return false;
            }

            while(true) {
                int var5 = workerCountOf(var3);
                if (var5 >= 536870911 || var5 >= (var2 ? this.corePoolSize : this.maximumPoolSize)) {
                    return false;
                }

                if (this.compareAndIncrementWorkerCount(var3)) {
                    boolean var18 = false;
                    boolean var19 = false;
                    ThreadPoolExecutor.Worker var20 = null;

                    try {
                        var20 = new ThreadPoolExecutor.Worker(var1);
                        Thread var6 = var20.thread;
                        if (var6 != null) {
                            ReentrantLock var7 = this.mainLock;
                            var7.lock();

                            try {
                                int var8 = runStateOf(this.ctl.get());
                                if (var8 < 0 || var8 == 0 && var1 == null) {
                                    if (var6.isAlive()) {
                                        throw new IllegalThreadStateException();
                                    }

                                    this.workers.add(var20);
                                    int var9 = this.workers.size();
                                    if (var9 > this.largestPoolSize) {
                                        this.largestPoolSize = var9;
                                    }

                                    var19 = true;
                                }
                            } finally {
                                var7.unlock();
                            }

                            if (var19) {
                                var6.start();
                                var18 = true;
                            }
                        }
                    } finally {
                        if (!var18) {
                            this.addWorkerFailed(var20);
                        }

                    }

                    return var18;
                }

                var3 = this.ctl.get();
                if (runStateOf(var3) != var4) {
                    break;
                }
            }
        }
    }

    private void addWorkerFailed(ThreadPoolExecutor.Worker var1) {
        ReentrantLock var2 = this.mainLock;
        var2.lock();

        try {
            if (var1 != null) {
                this.workers.remove(var1);
            }

            this.decrementWorkerCount();
            this.tryTerminate();
        } finally {
            var2.unlock();
        }

    }

    private void processWorkerExit(ThreadPoolExecutor.Worker var1, boolean var2) {
        if (var2) {
            this.decrementWorkerCount();
        }

        ReentrantLock var3 = this.mainLock;
        var3.lock();

        try {
            this.completedTaskCount += var1.completedTasks;
            this.workers.remove(var1);
        } finally {
            var3.unlock();
        }

        this.tryTerminate();
        int var4 = this.ctl.get();
        if (runStateLessThan(var4, 536870912)) {
            if (!var2) {
                int var5 = this.allowCoreThreadTimeOut ? 0 : this.corePoolSize;
                if (var5 == 0 && !this.workQueue.isEmpty()) {
                    var5 = 1;
                }

                if (workerCountOf(var4) >= var5) {
                    return;
                }
            }

            this.addWorker((Runnable)null, false);
        }

    }

    private Runnable getTask() {
        boolean var1 = false;

        while(true) {
            int var2 = this.ctl.get();
            int var3 = runStateOf(var2);
            if (var3 >= 0 && (var3 >= 536870912 || this.workQueue.isEmpty())) {
                this.decrementWorkerCount();
                return null;
            }

            int var4 = workerCountOf(var2);
            boolean var5 = this.allowCoreThreadTimeOut || var4 > this.corePoolSize;
            if (var4 <= this.maximumPoolSize && (!var5 || !var1) || var4 <= 1 && !this.workQueue.isEmpty()) {
                try {
                    Runnable var6 = var5 ? (Runnable)this.workQueue.poll(this.keepAliveTime, TimeUnit.NANOSECONDS) : (Runnable)this.workQueue.take();
                    if (var6 != null) {
                        return var6;
                    }

                    var1 = true;
                } catch (InterruptedException var7) {
                    var1 = false;
                }
            } else if (this.compareAndDecrementWorkerCount(var2)) {
                return null;
            }
        }
    }

    final void runWorker(ThreadPoolExecutor.Worker var1) {
        Thread var2 = Thread.currentThread();
        Runnable var3 = var1.firstTask;
        var1.firstTask = null;
        var1.unlock();
        boolean var4 = true;

        try {
            while(var3 != null || (var3 = this.getTask()) != null) {
                var1.lock();
                if ((runStateAtLeast(this.ctl.get(), 536870912) || Thread.interrupted() && runStateAtLeast(this.ctl.get(), 536870912)) && !var2.isInterrupted()) {
                    var2.interrupt();
                }

                try {
                    this.beforeExecute(var2, var3);
                    Object var5 = null;

                    try {
                        var3.run();
                    } catch (RuntimeException var28) {
                        var5 = var28;
                        throw var28;
                    } catch (Error var29) {
                        var5 = var29;
                        throw var29;
                    } catch (Throwable var30) {
                        var5 = var30;
                        throw new Error(var30);
                    } finally {
                        this.afterExecute(var3, (Throwable)var5);
                    }
                } finally {
                    var3 = null;
                    ++var1.completedTasks;
                    var1.unlock();
                }
            }

            var4 = false;
        } finally {
            this.processWorkerExit(var1, var4);
        }

    }

    public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6) {
        this(var1, var2, var3, var5, var6, Executors.defaultThreadFactory(), defaultHandler);
    }

    public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6, ThreadFactory var7) {
        this(var1, var2, var3, var5, var6, var7, defaultHandler);
    }

    public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6, RejectedExecutionHandler var7) {
        this(var1, var2, var3, var5, var6, Executors.defaultThreadFactory(), var7);
    }

    public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6, ThreadFactory var7, RejectedExecutionHandler var8) {
        this.ctl = new AtomicInteger(ctlOf(-536870912, 0));
        this.mainLock = new ReentrantLock();
        this.workers = new HashSet();
        this.termination = this.mainLock.newCondition();
        if (var1 >= 0 && var2 > 0 && var2 >= var1 && var3 >= 0L) {
            if (var6 != null && var7 != null && var8 != null) {
                this.corePoolSize = var1;
                this.maximumPoolSize = var2;
                this.workQueue = var6;
                this.keepAliveTime = var5.toNanos(var3);
                this.threadFactory = var7;
                this.handler = var8;
            } else {
                throw new NullPointerException();
            }
        } else {
            throw new IllegalArgumentException();
        }
    }

    public void execute(Runnable var1) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            int var2 = this.ctl.get();
            if (workerCountOf(var2) < this.corePoolSize) {
                if (this.addWorker(var1, true)) {
                    return;
                }

                var2 = this.ctl.get();
            }

            if (isRunning(var2) && this.workQueue.offer(var1)) {
                int var3 = this.ctl.get();
                if (!isRunning(var3) && this.remove(var1)) {
                    this.reject(var1);
                } else if (workerCountOf(var3) == 0) {
                    this.addWorker((Runnable)null, false);
                }
            } else if (!this.addWorker(var1, false)) {
                this.reject(var1);
            }

        }
    }

    public void shutdown() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            this.checkShutdownAccess();
            this.advanceRunState(0);
            this.interruptIdleWorkers();
            this.onShutdown();
        } finally {
            var1.unlock();
        }

        this.tryTerminate();
    }

    public List<Runnable> shutdownNow() {
        ReentrantLock var2 = this.mainLock;
        var2.lock();

        List var1;
        try {
            this.checkShutdownAccess();
            this.advanceRunState(536870912);
            this.interruptWorkers();
            var1 = this.drainQueue();
        } finally {
            var2.unlock();
        }

        this.tryTerminate();
        return var1;
    }

    public boolean isShutdown() {
        return !isRunning(this.ctl.get());
    }

    public boolean isTerminating() {
        int var1 = this.ctl.get();
        return !isRunning(var1) && runStateLessThan(var1, 1610612736);
    }

    public boolean isTerminated() {
        return runStateAtLeast(this.ctl.get(), 1610612736);
    }

    public boolean awaitTermination(long var1, TimeUnit var3) throws InterruptedException {
        long var4 = var3.toNanos(var1);
        ReentrantLock var6 = this.mainLock;
        var6.lock();

        boolean var7;
        try {
            while(!runStateAtLeast(this.ctl.get(), 1610612736)) {
                if (var4 <= 0L) {
                    var7 = false;
                    return var7;
                }

                var4 = this.termination.awaitNanos(var4);
            }

            var7 = true;
        } finally {
            var6.unlock();
        }

        return var7;
    }

    protected void finalize() {
        this.shutdown();
    }

    public void setThreadFactory(ThreadFactory var1) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            this.threadFactory = var1;
        }
    }

    public ThreadFactory getThreadFactory() {
        return this.threadFactory;
    }

    public void setRejectedExecutionHandler(RejectedExecutionHandler var1) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            this.handler = var1;
        }
    }

    public RejectedExecutionHandler getRejectedExecutionHandler() {
        return this.handler;
    }

    public void setCorePoolSize(int var1) {
        if (var1 < 0) {
            throw new IllegalArgumentException();
        } else {
            int var2 = var1 - this.corePoolSize;
            this.corePoolSize = var1;
            if (workerCountOf(this.ctl.get()) > var1) {
                this.interruptIdleWorkers();
            } else if (var2 > 0) {
                int var3 = Math.min(var2, this.workQueue.size());

                while(var3-- > 0 && this.addWorker((Runnable)null, true) && !this.workQueue.isEmpty()) {
                    ;
                }
            }

        }
    }

    public int getCorePoolSize() {
        return this.corePoolSize;
    }

    public boolean prestartCoreThread() {
        return workerCountOf(this.ctl.get()) < this.corePoolSize && this.addWorker((Runnable)null, true);
    }

    void ensurePrestart() {
        int var1 = workerCountOf(this.ctl.get());
        if (var1 < this.corePoolSize) {
            this.addWorker((Runnable)null, true);
        } else if (var1 == 0) {
            this.addWorker((Runnable)null, false);
        }

    }

    public int prestartAllCoreThreads() {
        int var1;
        for(var1 = 0; this.addWorker((Runnable)null, true); ++var1) {
            ;
        }

        return var1;
    }

    public boolean allowsCoreThreadTimeOut() {
        return this.allowCoreThreadTimeOut;
    }

    public void allowCoreThreadTimeOut(boolean var1) {
        if (var1 && this.keepAliveTime <= 0L) {
            throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
        } else {
            if (var1 != this.allowCoreThreadTimeOut) {
                this.allowCoreThreadTimeOut = var1;
                if (var1) {
                    this.interruptIdleWorkers();
                }
            }

        }
    }

    public void setMaximumPoolSize(int var1) {
        if (var1 > 0 && var1 >= this.corePoolSize) {
            this.maximumPoolSize = var1;
            if (workerCountOf(this.ctl.get()) > var1) {
                this.interruptIdleWorkers();
            }

        } else {
            throw new IllegalArgumentException();
        }
    }

    public int getMaximumPoolSize() {
        return this.maximumPoolSize;
    }

    public void setKeepAliveTime(long var1, TimeUnit var3) {
        if (var1 < 0L) {
            throw new IllegalArgumentException();
        } else if (var1 == 0L && this.allowsCoreThreadTimeOut()) {
            throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
        } else {
            long var4 = var3.toNanos(var1);
            long var6 = var4 - this.keepAliveTime;
            this.keepAliveTime = var4;
            if (var6 < 0L) {
                this.interruptIdleWorkers();
            }

        }
    }

    public long getKeepAliveTime(TimeUnit var1) {
        return var1.convert(this.keepAliveTime, TimeUnit.NANOSECONDS);
    }

    public BlockingQueue<Runnable> getQueue() {
        return this.workQueue;
    }

    public boolean remove(Runnable var1) {
        boolean var2 = this.workQueue.remove(var1);
        this.tryTerminate();
        return var2;
    }

    public void purge() {
        BlockingQueue var1 = this.workQueue;

        try {
            Iterator var2 = var1.iterator();

            while(var2.hasNext()) {
                Runnable var8 = (Runnable)var2.next();
                if (var8 instanceof Future && ((Future)var8).isCancelled()) {
                    var2.remove();
                }
            }
        } catch (ConcurrentModificationException var7) {
            Object[] var3 = var1.toArray();
            int var4 = var3.length;

            for(int var5 = 0; var5 < var4; ++var5) {
                Object var6 = var3[var5];
                if (var6 instanceof Future && ((Future)var6).isCancelled()) {
                    var1.remove(var6);
                }
            }
        }

        this.tryTerminate();
    }

    public int getPoolSize() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        int var2;
        try {
            var2 = runStateAtLeast(this.ctl.get(), 1073741824) ? 0 : this.workers.size();
        } finally {
            var1.unlock();
        }

        return var2;
    }

    public int getActiveCount() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            int var2 = 0;
            Iterator var3 = this.workers.iterator();

            while(var3.hasNext()) {
                ThreadPoolExecutor.Worker var4 = (ThreadPoolExecutor.Worker)var3.next();
                if (var4.isLocked()) {
                    ++var2;
                }
            }

            int var8 = var2;
            return var8;
        } finally {
            var1.unlock();
        }
    }

    public int getLargestPoolSize() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        int var2;
        try {
            var2 = this.largestPoolSize;
        } finally {
            var1.unlock();
        }

        return var2;
    }

    public long getTaskCount() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            long var2 = this.completedTaskCount;
            Iterator var4 = this.workers.iterator();

            while(var4.hasNext()) {
                ThreadPoolExecutor.Worker var5 = (ThreadPoolExecutor.Worker)var4.next();
                var2 += var5.completedTasks;
                if (var5.isLocked()) {
                    ++var2;
                }
            }

            long var9 = var2 + (long)this.workQueue.size();
            return var9;
        } finally {
            var1.unlock();
        }
    }

    public long getCompletedTaskCount() {
        ReentrantLock var1 = this.mainLock;
        var1.lock();

        try {
            long var2 = this.completedTaskCount;

            ThreadPoolExecutor.Worker var5;
            for(Iterator var4 = this.workers.iterator(); var4.hasNext(); var2 += var5.completedTasks) {
                var5 = (ThreadPoolExecutor.Worker)var4.next();
            }

            long var9 = var2;
            return var9;
        } finally {
            var1.unlock();
        }
    }

    public String toString() {
        ReentrantLock var5 = this.mainLock;
        var5.lock();

        long var1;
        int var3;
        int var4;
        try {
            var1 = this.completedTaskCount;
            var4 = 0;
            var3 = this.workers.size();
            Iterator var6 = this.workers.iterator();

            while(var6.hasNext()) {
                ThreadPoolExecutor.Worker var7 = (ThreadPoolExecutor.Worker)var6.next();
                var1 += var7.completedTasks;
                if (var7.isLocked()) {
                    ++var4;
                }
            }
        } finally {
            var5.unlock();
        }

        int var11 = this.ctl.get();
        String var12 = runStateLessThan(var11, 0) ? "Running" : (runStateAtLeast(var11, 1610612736) ? "Terminated" : "Shutting down");
        return super.toString() + "[" + var12 + ", pool size = " + var3 + ", active threads = " + var4 + ", queued tasks = " + this.workQueue.size() + ", completed tasks = " + var1 + "]";
    }

    protected void beforeExecute(Thread var1, Runnable var2) {
    }

    protected void afterExecute(Runnable var1, Throwable var2) {
    }

    protected void terminated() {
    }

    public static class AbortPolicy implements RejectedExecutionHandler {
        public AbortPolicy() {
        }

        public void rejectedExecution(Runnable var1, ThreadPoolExecutor var2) {
            throw new RejectedExecutionException("Task " + var1.toString() + " rejected from " + var2.toString());
        }
    }

    public static class CallerRunsPolicy implements RejectedExecutionHandler {
        public CallerRunsPolicy() {
        }

        public void rejectedExecution(Runnable var1, ThreadPoolExecutor var2) {
            if (!var2.isShutdown()) {
                var1.run();
            }

        }
    }

    public static class DiscardOldestPolicy implements RejectedExecutionHandler {
        public DiscardOldestPolicy() {
        }

        public void rejectedExecution(Runnable var1, ThreadPoolExecutor var2) {
            if (!var2.isShutdown()) {
                var2.getQueue().poll();
                var2.execute(var1);
            }

        }
    }

    public static class DiscardPolicy implements RejectedExecutionHandler {
        public DiscardPolicy() {
        }

        public void rejectedExecution(Runnable var1, ThreadPoolExecutor var2) {
        }
    }

    private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
        private static final long serialVersionUID = 6138294804551838833L;
        final Thread thread;
        Runnable firstTask;
        volatile long completedTasks;

        Worker(Runnable var2) {
            this.setState(-1);
            this.firstTask = var2;
            this.thread = ThreadPoolExecutor.this.getThreadFactory().newThread(this);
        }

        public void run() {
            ThreadPoolExecutor.this.runWorker(this);
        }

        protected boolean isHeldExclusively() {
            return this.getState() != 0;
        }

        protected boolean tryAcquire(int var1) {
            if (this.compareAndSetState(0, 1)) {
                this.setExclusiveOwnerThread(Thread.currentThread());
                return true;
            } else {
                return false;
            }
        }

        protected boolean tryRelease(int var1) {
            this.setExclusiveOwnerThread((Thread)null);
            this.setState(0);
            return true;
        }

        public void lock() {
            this.acquire(1);
        }

        public boolean tryLock() {
            return this.tryAcquire(1);
        }

        public void unlock() {
            this.release(1);
        }

        public boolean isLocked() {
            return this.isHeldExclusively();
        }

        void interruptIfStarted() {
            if (this.getState() >= 0) {
                Thread var1 = this.thread;
                if (this.thread != null && !var1.isInterrupted()) {
                    try {
                        var1.interrupt();
                    } catch (SecurityException var3) {
                        ;
                    }
                }
            }

        }
    }
}

关键参数,coreSize,maxSize, keepAliveTime, allowCoreThreadTimeOut等都是volatile, 池容器是hashset

AbstractExecutorService 源码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package java.util.concurrent;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public abstract class AbstractExecutorService implements ExecutorService {
    public AbstractExecutorService() {
    }

    protected <T> RunnableFuture<T> newTaskFor(Runnable var1, T var2) {
        return new FutureTask(var1, var2);
    }

    protected <T> RunnableFuture<T> newTaskFor(Callable<T> var1) {
        return new FutureTask(var1);
    }

    public Future<?> submit(Runnable var1) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            RunnableFuture var2 = this.newTaskFor(var1, (Object)null);
            this.execute(var2);
            return var2;
        }
    }

    public <T> Future<T> submit(Runnable var1, T var2) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            RunnableFuture var3 = this.newTaskFor(var1, var2);
            this.execute(var3);
            return var3;
        }
    }

    public <T> Future<T> submit(Callable<T> var1) {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            RunnableFuture var2 = this.newTaskFor(var1);
            this.execute(var2);
            return var2;
        }
    }

    private <T> T doInvokeAny(Collection<? extends Callable<T>> var1, boolean var2, long var3) throws InterruptedException, ExecutionException, TimeoutException {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            int var5 = var1.size();
            if (var5 == 0) {
                throw new IllegalArgumentException();
            } else {
                ArrayList var6 = new ArrayList(var5);
                ExecutorCompletionService var7 = new ExecutorCompletionService(this);
                boolean var23 = false;

                Object var14;
                try {
                    var23 = true;
                    ExecutionException var8 = null;
                    long var9 = var2 ? System.nanoTime() + var3 : 0L;
                    Iterator var11 = var1.iterator();
                    var6.add(var7.submit((Callable)var11.next()));
                    --var5;
                    int var12 = 1;

                    while(true) {
                        Future var13 = var7.poll();
                        if (var13 == null) {
                            if (var5 > 0) {
                                --var5;
                                var6.add(var7.submit((Callable)var11.next()));
                                ++var12;
                            } else {
                                if (var12 == 0) {
                                    if (var8 == null) {
                                        var8 = new ExecutionException();
                                    }

                                    throw var8;
                                }

                                if (var2) {
                                    var13 = var7.poll(var3, TimeUnit.NANOSECONDS);
                                    if (var13 == null) {
                                        throw new TimeoutException();
                                    }

                                    var3 = var9 - System.nanoTime();
                                } else {
                                    var13 = var7.take();
                                }
                            }
                        }

                        if (var13 != null) {
                            --var12;

                            try {
                                var14 = var13.get();
                                var23 = false;
                                break;
                            } catch (ExecutionException var24) {
                                var8 = var24;
                            } catch (RuntimeException var25) {
                                var8 = new ExecutionException(var25);
                            }
                        }
                    }
                } finally {
                    if (var23) {
                        int var18 = 0;

                        for(int var19 = var6.size(); var18 < var19; ++var18) {
                            ((Future)var6.get(var18)).cancel(true);
                        }

                    }
                }

                int var15 = 0;

                for(int var16 = var6.size(); var15 < var16; ++var15) {
                    ((Future)var6.get(var15)).cancel(true);
                }

                return var14;
            }
        }
    }

    public <T> T invokeAny(Collection<? extends Callable<T>> var1) throws InterruptedException, ExecutionException {
        try {
            return this.doInvokeAny(var1, false, 0L);
        } catch (TimeoutException var3) {
            assert false;

            return null;
        }
    }

    public <T> T invokeAny(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException, ExecutionException, TimeoutException {
        return this.doInvokeAny(var1, true, var4.toNanos(var2));
    }

    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1) throws InterruptedException {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            ArrayList var2 = new ArrayList(var1.size());
            boolean var3 = false;
            boolean var14 = false;

            ArrayList var19;
            int var20;
            try {
                var14 = true;
                Iterator var4 = var1.iterator();

                while(true) {
                    if (!var4.hasNext()) {
                        int var18 = 0;

                        for(var20 = var2.size(); var18 < var20; ++var18) {
                            Future var21 = (Future)var2.get(var18);
                            if (!var21.isDone()) {
                                try {
                                    var21.get();
                                } catch (CancellationException var15) {
                                    ;
                                } catch (ExecutionException var16) {
                                    ;
                                }
                            }
                        }

                        var3 = true;
                        var19 = var2;
                        var14 = false;
                        break;
                    }

                    Callable var5 = (Callable)var4.next();
                    RunnableFuture var6 = this.newTaskFor(var5);
                    var2.add(var6);
                    this.execute(var6);
                }
            } finally {
                if (var14) {
                    if (!var3) {
                        int var9 = 0;

                        for(int var10 = var2.size(); var9 < var10; ++var9) {
                            ((Future)var2.get(var9)).cancel(true);
                        }
                    }

                }
            }

            if (!var3) {
                var20 = 0;

                for(int var22 = var2.size(); var20 < var22; ++var20) {
                    ((Future)var2.get(var20)).cancel(true);
                }
            }

            return var19;
        }
    }

    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException {
        if (var1 == null) {
            throw new NullPointerException();
        } else {
            long var5 = var4.toNanos(var2);
            ArrayList var7 = new ArrayList(var1.size());
            boolean var8 = false;
            boolean var25 = false;

            ArrayList var14;
            int var16;
            int var35;
            label274: {
                ArrayList var15;
                label275: {
                    ArrayList var31;
                    int var34;
                    label276: {
                        ArrayList var13;
                        try {
                            label286: {
                                var25 = true;
                                Iterator var9 = var1.iterator();

                                while(var9.hasNext()) {
                                    Callable var10 = (Callable)var9.next();
                                    var7.add(this.newTaskFor(var10));
                                }

                                long var30 = System.nanoTime() + var5;
                                int var11 = var7.size();

                                int var12;
                                for(var12 = 0; var12 < var11; ++var12) {
                                    this.execute((Runnable)var7.get(var12));
                                    var5 = var30 - System.nanoTime();
                                    if (var5 <= 0L) {
                                        var13 = var7;
                                        var25 = false;
                                        break label286;
                                    }
                                }

                                for(var12 = 0; var12 < var11; ++var12) {
                                    Future var32 = (Future)var7.get(var12);
                                    if (!var32.isDone()) {
                                        if (var5 <= 0L) {
                                            var14 = var7;
                                            var25 = false;
                                            break label274;
                                        }

                                        try {
                                            var32.get(var5, TimeUnit.NANOSECONDS);
                                        } catch (CancellationException var26) {
                                            ;
                                        } catch (ExecutionException var27) {
                                            ;
                                        } catch (TimeoutException var28) {
                                            var15 = var7;
                                            var25 = false;
                                            break label275;
                                        }

                                        var5 = var30 - System.nanoTime();
                                    }
                                }

                                var8 = true;
                                var31 = var7;
                                var25 = false;
                                break label276;
                            }
                        } finally {
                            if (var25) {
                                if (!var8) {
                                    int var19 = 0;

                                    for(int var20 = var7.size(); var19 < var20; ++var19) {
                                        ((Future)var7.get(var19)).cancel(true);
                                    }
                                }

                            }
                        }

                        if (!var8) {
                            var34 = 0;

                            for(var35 = var7.size(); var34 < var35; ++var34) {
                                ((Future)var7.get(var34)).cancel(true);
                            }
                        }

                        return var13;
                    }

                    if (!var8) {
                        int var33 = 0;

                        for(var34 = var7.size(); var33 < var34; ++var33) {
                            ((Future)var7.get(var33)).cancel(true);
                        }
                    }

                    return var31;
                }

                if (!var8) {
                    var16 = 0;

                    for(int var17 = var7.size(); var16 < var17; ++var16) {
                        ((Future)var7.get(var16)).cancel(true);
                    }
                }

                return var15;
            }

            if (!var8) {
                var35 = 0;

                for(var16 = var7.size(); var35 < var16; ++var35) {
                    ((Future)var7.get(var35)).cancel(true);
                }
            }

            return var14;
        }
    }
}

ExecutorService 源码:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package java.util.concurrent;

import java.util.Collection;
import java.util.List;

public interface ExecutorService extends Executor {
    void shutdown();

    List<Runnable> shutdownNow();

    boolean isShutdown();

    boolean isTerminated();

    boolean awaitTermination(long var1, TimeUnit var3) throws InterruptedException;

    <T> Future<T> submit(Callable<T> var1);

    <T> Future<T> submit(Runnable var1, T var2);

    Future<?> submit(Runnable var1);

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1) throws InterruptedException;

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException;

    <T> T invokeAny(Collection<? extends Callable<T>> var1) throws InterruptedException, ExecutionException;

    <T> T invokeAny(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException, ExecutionException, TimeoutException;
}

Executor 源码:

package java.util.concurrent;

public interface Executor {
    void execute(Runnable var1);
}



猜你喜欢

转载自blog.csdn.net/lxlmycsdnfree/article/details/80999206