Executors 源码解析(JDK8)

article/2025/9/9 2:23:30

前言

本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见100个问题搞定Java并发

正文

在这里插入图片描述

类注释

/*** Factory and utility methods for {@link Executor}, {@link* ExecutorService}, {@link ScheduledExecutorService}, {@link* ThreadFactory}, and {@link Callable} classes defined in this* package. This class supports the following kinds of methods:** <ul>*   <li> Methods that create and return an {@link ExecutorService}*        set up with commonly useful configuration settings.*   <li> Methods that create and return a {@link ScheduledExecutorService}*        set up with commonly useful configuration settings.*   <li> Methods that create and return a "wrapped" ExecutorService, that*        disables reconfiguration by making implementation-specific methods*        inaccessible.*   <li> Methods that create and return a {@link ThreadFactory}*        that sets newly created threads to a known state.*   <li> Methods that create and return a {@link Callable}*        out of other closure-like forms, so they can be used*        in execution methods requiring {@code Callable}.* </ul>** @since 1.5* @author Doug Lea*/
public class Executors {

当前包内定义的 Executor 、 ExecutorService 、 ScheduledExecutorService 、 ThreadFactory 和 Callable 类的工厂和实用程序方法。

此类支持以下类型的方法:

  1. 创建并返回使用常用配置设置的 ExecutorService 方法。
  2. 创建并返回使用常用配置设置设置的 ScheduledExecutorService 方法。
  3. 创建并返回“包装的” ExecutorService ,该服务通过使特定于实现的方法不可访问来禁用重新配置。
  4. 创建并返回将新创建的线程设置为已知状态的 ThreadFactory 方法。
  5. 这些方法从其他类似闭包的表单中创建并返回 Callable 的方法,因此可以在需要可调用的执行方法中使用它们。

固定大小的线程池

/*** Creates a thread pool that reuses a fixed number of threads* operating off a shared unbounded queue.  At any point, at most* {@code nThreads} threads will be active processing tasks.* If additional tasks are submitted when all threads are active,* they will wait in the queue until a thread is available.* If any thread terminates due to a failure during execution* prior to shutdown, a new one will take its place if needed to* execute subsequent tasks.  The threads in the pool will exist* until it is explicitly {@link ExecutorService#shutdown shutdown}.** @param nThreads the number of threads in the pool* @return the newly created thread pool* @throws IllegalArgumentException if {@code nThreads <= 0}*/public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}

创建一个线程池,该线程池重用在共享无界队列上运行固定数量的线程

在任何时候,最多 N 个活跃线程正在处理任务。

如果在所有线程都处于活动状态时提交其他任务,它们将在队列中等待,直到有线程可用。

如果任何线程在关机之前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程代替它。

池中的线程将一直存在,直到显式关闭。

    /*** Creates a thread pool that reuses a fixed number of threads* operating off a shared unbounded queue, using the provided* ThreadFactory to create new threads when needed.  At any point,* at most {@code nThreads} threads will be active processing* tasks.  If additional tasks are submitted when all threads are* active, they will wait in the queue until a thread is* available.  If any thread terminates due to a failure during* execution prior to shutdown, a new one will take its place if* needed to execute subsequent tasks.  The threads in the pool will* exist until it is explicitly {@link ExecutorService#shutdown* shutdown}.** @param nThreads the number of threads in the pool* @param threadFactory the factory to use when creating new threads* @return the newly created thread pool* @throws NullPointerException if threadFactory is null* @throws IllegalArgumentException if {@code nThreads <= 0}*/public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory);}

和上面的区别在于,可以在需要时使用提供的ThreadFactory创建新线程。

工作窃取线程池

    /*** Creates a thread pool that maintains enough threads to support* the given parallelism level, and may use multiple queues to* reduce contention. The parallelism level corresponds to the* maximum number of threads actively engaged in, or available to* engage in, task processing. The actual number of threads may* grow and shrink dynamically. A work-stealing pool makes no* guarantees about the order in which submitted tasks are* executed.** @param parallelism the targeted parallelism level* @return the newly created thread pool* @throws IllegalArgumentException if {@code parallelism <= 0}* @since 1.8*/public static ExecutorService newWorkStealingPool(int parallelism) {return new ForkJoinPool(parallelism,ForkJoinPool.defaultForkJoinWorkerThreadFactory,null, true);}

创建一个线程池,该线程池维护足够多的线程以支持给定的并行级别,并且可以使用多个队列来减少争用。

并行级别对应于积极参与或可参与任务处理的最大线程数。

线程的实际数量可能会动态增长和收缩。

工作窃取池不保证提交任务的执行顺序。

    /*** Creates a work-stealing thread pool using all* {@link Runtime#availableProcessors available processors}* as its target parallelism level.* @return the newly created thread pool* @see #newWorkStealingPool(int)* @since 1.8*/public static ExecutorService newWorkStealingPool() {return new ForkJoinPool(Runtime.getRuntime().availableProcessors(),ForkJoinPool.defaultForkJoinWorkerThreadFactory,null, true);}

使用所有可用的处理器作为其目标并行级别来创建工作线程池。

单个线程的线程池

    /*** Creates an Executor that uses a single worker thread operating* off an unbounded queue. (Note however that if this single* thread terminates due to a failure during execution prior to* shutdown, a new one will take its place if needed to execute* subsequent tasks.)  Tasks are guaranteed to execute* sequentially, and no more than one task will be active at any* given time. Unlike the otherwise equivalent* {@code newFixedThreadPool(1)} the returned executor is* guaranteed not to be reconfigurable to use additional threads.** @return the newly created single-threaded Executor*/public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}

创建一个执行器,该执行器使用在无界队列上运行的单个工作线程。

但是请注意,如果此单个线程在关机之前的执行过程中由于故障而终止,则在需要执行后续任务时,将替换一个新线程。

任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。

与上面的 newFixedThreadPool 不同,返回的执行器保证不可重新配置以使用其他线程。

    /*** Creates an Executor that uses a single worker thread operating* off an unbounded queue, and uses the provided ThreadFactory to* create a new thread when needed. Unlike the otherwise* equivalent {@code newFixedThreadPool(1, threadFactory)} the* returned executor is guaranteed not to be reconfigurable to use* additional threads.** @param threadFactory the factory to use when creating new* threads** @return the newly created single-threaded Executor* @throws NullPointerException if threadFactory is null*/public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),threadFactory));}

和上面的区别在于,可以在需要时使用提供的ThreadFactory创建新线程。

自适应调整、缓存无上限的线程池

    /*** Creates a thread pool that creates new threads as needed, but* will reuse previously constructed threads when they are* available.  These pools will typically improve the performance* of programs that execute many short-lived asynchronous tasks.* Calls to {@code execute} will reuse previously constructed* threads if available. If no existing thread is available, a new* thread will be created and added to the pool. Threads that have* not been used for sixty seconds are terminated and removed from* the cache. Thus, a pool that remains idle for long enough will* not consume any resources. Note that pools with similar* properties but different details (for example, timeout parameters)* may be created using {@link ThreadPoolExecutor} constructors.** @return the newly created thread pool*/public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}

创建一个线程池,该线程池根据需要创建新线程,但在以前构造的线程可用时将重用这些线程。

这些池通常会提高执行许多短期异步任务的程序的性能。

调用execute将重用以前构造的线程(如果可用)。

如果没有可用的现有线程,将创建一个新线程并将其添加到池中。

六十秒未使用的线程将被终止并从缓存中删除。

因此,空闲时间足够长的池不会消耗任何资源。

请注意,可以使用ThreadPoolExecutor构造函数创建具有类似属性但详细信息不同(例如超时参数)的池。

    /*** Creates a thread pool that creates new threads as needed, but* will reuse previously constructed threads when they are* available, and uses the provided* ThreadFactory to create new threads when needed.* @param threadFactory the factory to use when creating new threads* @return the newly created thread pool* @throws NullPointerException if threadFactory is null*/public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>(),threadFactory);}

和上面的区别在于,可以在需要时使用提供的ThreadFactory创建新线程。

单线程周期调度线程池

    /*** Creates a single-threaded executor that can schedule commands* to run after a given delay, or to execute periodically.* (Note however that if this single* thread terminates due to a failure during execution prior to* shutdown, a new one will take its place if needed to execute* subsequent tasks.)  Tasks are guaranteed to execute* sequentially, and no more than one task will be active at any* given time. Unlike the otherwise equivalent* {@code newScheduledThreadPool(1)} the returned executor is* guaranteed not to be reconfigurable to use additional threads.* @return the newly created scheduled executor*/public static ScheduledExecutorService newSingleThreadScheduledExecutor() {return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));}

创建单线程执行器,该执行器可以安排命令在给定延迟后运行,或定期执行。

但是请注意,如果此单个线程在关机之前的执行过程中由于故障而终止,则在需要执行后续任务时,将替换一个新线程。

任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。

与下面的 newScheduledThreadPool 不同,返回的执行器保证不可重新配置以使用其他线程。

    /*** Creates a single-threaded executor that can schedule commands* to run after a given delay, or to execute periodically.  (Note* however that if this single thread terminates due to a failure* during execution prior to shutdown, a new one will take its* place if needed to execute subsequent tasks.)  Tasks are* guaranteed to execute sequentially, and no more than one task* will be active at any given time. Unlike the otherwise* equivalent {@code newScheduledThreadPool(1, threadFactory)}* the returned executor is guaranteed not to be reconfigurable to* use additional threads.* @param threadFactory the factory to use when creating new* threads* @return a newly created scheduled executor* @throws NullPointerException if threadFactory is null*/public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1, threadFactory));}

和上面的区别在于,可以在需要时使用提供的ThreadFactory创建新线程。

周期调度线程池

    /*** Creates a thread pool that can schedule commands to run after a* given delay, or to execute periodically.* @param corePoolSize the number of threads to keep in the pool,* even if they are idle* @return a newly created scheduled thread pool* @throws IllegalArgumentException if {@code corePoolSize < 0}*/public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);}

创建一个线程池,该线程池可以安排命令在给定延迟后运行,或定期执行。

参数: corePoolSize–池中要保留的线程数,即使它们处于空闲状态

    /*** Creates a thread pool that can schedule commands to run after a* given delay, or to execute periodically.* @param corePoolSize the number of threads to keep in the pool,* even if they are idle* @param threadFactory the factory to use when the executor* creates a new thread* @return a newly created scheduled thread pool* @throws IllegalArgumentException if {@code corePoolSize < 0}* @throws NullPointerException if threadFactory is null*/public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) {return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);}

和上面的区别在于,可以在需要时使用提供的ThreadFactory创建新线程。

不可配置代理线程池

    /*** Returns an object that delegates all defined {@link* ExecutorService} methods to the given executor, but not any* other methods that might otherwise be accessible using* casts. This provides a way to safely "freeze" configuration and* disallow tuning of a given concrete implementation.* @param executor the underlying implementation* @return an {@code ExecutorService} instance* @throws NullPointerException if executor null*/public static ExecutorService unconfigurableExecutorService(ExecutorService executor) {if (executor == null)throw new NullPointerException();return new DelegatedExecutorService(executor);}

返回一个对象,该对象将所有已定义的ExecutorService方法委托给给定的执行器,但不委托任何其他可以使用强制转换访问的方法。

这提供了一种安全地“冻结”配置并禁止对给定具体实现进行调优的方法。

不可配置周期调度线程池

    /*** Returns an object that delegates all defined {@link* ScheduledExecutorService} methods to the given executor, but* not any other methods that might otherwise be accessible using* casts. This provides a way to safely "freeze" configuration and* disallow tuning of a given concrete implementation.* @param executor the underlying implementation* @return a {@code ScheduledExecutorService} instance* @throws NullPointerException if executor null*/public static ScheduledExecutorService unconfigurableScheduledExecutorService(ScheduledExecutorService executor) {if (executor == null)throw new NullPointerException();return new DelegatedScheduledExecutorService(executor);}

和上面的区别在于 针对的是 ScheduledExecutorService

默认线程工厂

    /*** Returns a default thread factory used to create new threads.* This factory creates all new threads used by an Executor in the* same {@link ThreadGroup}. If there is a {@link* java.lang.SecurityManager}, it uses the group of {@link* System#getSecurityManager}, else the group of the thread* invoking this {@code defaultThreadFactory} method. Each new* thread is created as a non-daemon thread with priority set to* the smaller of {@code Thread.NORM_PRIORITY} and the maximum* priority permitted in the thread group.  New threads have names* accessible via {@link Thread#getName} of* <em>pool-N-thread-M</em>, where <em>N</em> is the sequence* number of this factory, and <em>M</em> is the sequence number* of the thread created by this factory.* @return a thread factory*/public static ThreadFactory defaultThreadFactory() {return new DefaultThreadFactory();}

返回用于创建新线程的默认线程工厂。

此工厂在同一线程组中创建执行器使用的所有新线程。

如果存在SecurityManager,则使用System.getSecurityManager组,否则使用调用此defaultThreadFactory方法的线程组。

每个新线程被创建为非守护进程线程,优先级设置为thread.NORM_priority和线程组中允许的最大优先级中的较小者。

新线程的名称可以通过pool-N-Thread-M的Thread.getName访问,其中N是此工厂的序列号,M是此工厂创建的线程的序列号。

特权线程工厂

    /*** Returns a thread factory used to create new threads that* have the same permissions as the current thread.* This factory creates threads with the same settings as {@link* Executors#defaultThreadFactory}, additionally setting the* AccessControlContext and contextClassLoader of new threads to* be the same as the thread invoking this* {@code privilegedThreadFactory} method.  A new* {@code privilegedThreadFactory} can be created within an* {@link AccessController#doPrivileged AccessController.doPrivileged}* action setting the current thread's access control context to* create threads with the selected permission settings holding* within that action.** <p>Note that while tasks running within such threads will have* the same access control and class loader settings as the* current thread, they need not have the same {@link* java.lang.ThreadLocal} or {@link* java.lang.InheritableThreadLocal} values. If necessary,* particular values of thread locals can be set or reset before* any task runs in {@link ThreadPoolExecutor} subclasses using* {@link ThreadPoolExecutor#beforeExecute(Thread, Runnable)}.* Also, if it is necessary to initialize worker threads to have* the same InheritableThreadLocal settings as some other* designated thread, you can create a custom ThreadFactory in* which that thread waits for and services requests to create* others that will inherit its values.** @return a thread factory* @throws AccessControlException if the current access control* context does not have permission to both get and set context* class loader*/public static ThreadFactory privilegedThreadFactory() {return new PrivilegedThreadFactory();}

返回用于创建与当前线程具有相同权限的新线程的线程工厂。

此工厂使用与defaultThreadFactory相同的设置创建线程,另外将新线程的AccessControlContext和contextClassLoader设置为与调用此privilegedThreadFactory方法的线程相同。

可以在AccessController.doPrivileged操作中创建新的privilegedThreadFactory,该操作设置当前线程的访问控制上下文,以创建在该操作中保留选定权限设置的线程。

请注意,虽然在此类线程中运行的任务将具有与当前线程相同的访问控制和类加载器设置,但它们不需要具有相同的ThreadLocal或InheritableThreadLocal值。

如有必要,在ThreadPoolExecutor子类中运行任何任务之前,可以使用ThreadPoolExecutor.beforeExecute(thread,Runnable)设置或重置线程局部变量的特定值。

此外,如果需要初始化工作线程以使其具有与其他指定线程相同的InheritableThreadLocal设置,则可以创建一个自定义ThreadFactory,该线程在其中等待和服务请求创建将继承其值的其他线程。

Callable

    /*** Returns a {@link Callable} object that, when* called, runs the given task and returns the given result.  This* can be useful when applying methods requiring a* {@code Callable} to an otherwise resultless action.* @param task the task to run* @param result the result to return* @param <T> the type of the result* @return a callable object* @throws NullPointerException if task null*/public static <T> Callable<T> callable(Runnable task, T result) {if (task == null)throw new NullPointerException();return new RunnableAdapter<T>(task, result);}

返回一个 Callable 对象,该对象在被调用时运行给定任务并返回给定结果。

这在将需要 Callable 的方法应用于其他无结果的操作时非常有用。

    /*** Returns a {@link Callable} object that, when* called, runs the given task and returns {@code null}.* @param task the task to run* @return a callable object* @throws NullPointerException if task null*/public static Callable<Object> callable(Runnable task) {if (task == null)throw new NullPointerException();return new RunnableAdapter<Object>(task, null);}

返回一个 Callable 对象,该对象在被调用时运行给定任务并返回null。

    /*** Returns a {@link Callable} object that, when* called, runs the given privileged action and returns its result.* @param action the privileged action to run* @return a callable object* @throws NullPointerException if action null*/public static Callable<Object> callable(final PrivilegedAction<?> action) {if (action == null)throw new NullPointerException();return new Callable<Object>() {public Object call() { return action.run(); }};}

返回一个 Callable 对象,该对象在被调用时运行给定的特权操作并返回其结果。

    /*** Returns a {@link Callable} object that, when* called, runs the given privileged exception action and returns* its result.* @param action the privileged exception action to run* @return a callable object* @throws NullPointerException if action null*/public static Callable<Object> callable(final PrivilegedExceptionAction<?> action) {if (action == null)throw new NullPointerException();return new Callable<Object>() {public Object call() throws Exception { return action.run(); }};}

返回一个 Callable 对象,该对象在被调用时运行给定的特权异常操作并返回其结果。

    /*** Returns a {@link Callable} object that will, when called,* execute the given {@code callable} under the current access* control context. This method should normally be invoked within* an {@link AccessController#doPrivileged AccessController.doPrivileged}* action to create callables that will, if possible, execute* under the selected permission settings holding within that* action; or if not possible, throw an associated {@link* AccessControlException}.* @param callable the underlying task* @param <T> the type of the callable's result* @return a callable object* @throws NullPointerException if callable null*/public static <T> Callable<T> privilegedCallable(Callable<T> callable) {if (callable == null)throw new NullPointerException();return new PrivilegedCallable<T>(callable);}

返回一个 Callable 对象,该对象在被调用时将在当前访问控制上下文下执行给定的可调用对象。

此方法通常应在AccessController.doPrivileged操作中调用,以创建可调用项,

如果可能,可调用项将在该操作中保留的选定权限设置下执行;

或者,如果不可能,抛出关联的AccessControlException。

    /*** Returns a {@link Callable} object that will, when called,* execute the given {@code callable} under the current access* control context, with the current context class loader as the* context class loader. This method should normally be invoked* within an* {@link AccessController#doPrivileged AccessController.doPrivileged}* action to create callables that will, if possible, execute* under the selected permission settings holding within that* action; or if not possible, throw an associated {@link* AccessControlException}.** @param callable the underlying task* @param <T> the type of the callable's result* @return a callable object* @throws NullPointerException if callable null* @throws AccessControlException if the current access control* context does not have permission to both set and get context* class loader*/public static <T> Callable<T> privilegedCallableUsingCurrentClassLoader(Callable<T> callable) {if (callable == null)throw new NullPointerException();return new PrivilegedCallableUsingCurrentClassLoader<T>(callable);}

返回一个 Callable 对象,该对象在被调用时将在当前访问控制上下文下执行给定的可调用对象,并将当前上下文类装入器作为上下文类装入器。

此方法通常应在AccessController.doPrivileged操作中调用,以创建可调用项,

如果可能,可调用项将在该操作中保留的选定权限设置下执行;

或者,如果不可能,抛出关联的AccessControlException。

下面是支持上面 public 方法的非 public 方法

运行给定任务并返回给定结果的可调用类

    /*** A callable that runs given task and returns given result*/static final class RunnableAdapter<T> implements Callable<T> {final Runnable task;final T result;RunnableAdapter(Runnable task, T result) {this.task = task;this.result = result;}public T call() {task.run();return result;}}

在已建立的访问控制设置下运行的可调用类

    /*** A callable that runs under established access control settings*/static final class PrivilegedCallable<T> implements Callable<T> {private final Callable<T> task;private final AccessControlContext acc;PrivilegedCallable(Callable<T> task) {this.task = task;this.acc = AccessController.getContext();}public T call() throws Exception {try {return AccessController.doPrivileged(new PrivilegedExceptionAction<T>() {public T run() throws Exception {return task.call();}}, acc);} catch (PrivilegedActionException e) {throw e.getException();}}}

在已建立的访问控制设置和当前类加载器下运行的可调用类

    /*** A callable that runs under established access control settings and* current ClassLoader*/static final class PrivilegedCallableUsingCurrentClassLoader<T> implements Callable<T> {private final Callable<T> task;private final AccessControlContext acc;private final ClassLoader ccl;PrivilegedCallableUsingCurrentClassLoader(Callable<T> task) {SecurityManager sm = System.getSecurityManager();if (sm != null) {// Calls to getContextClassLoader from this class// never trigger a security check, but we check// whether our callers have this permission anyways.sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);// Whether setContextClassLoader turns out to be necessary// or not, we fail fast if permission is not available.sm.checkPermission(new RuntimePermission("setContextClassLoader"));}this.task = task;this.acc = AccessController.getContext();this.ccl = Thread.currentThread().getContextClassLoader();}public T call() throws Exception {try {return AccessController.doPrivileged(new PrivilegedExceptionAction<T>() {public T run() throws Exception {Thread t = Thread.currentThread();ClassLoader cl = t.getContextClassLoader();if (ccl == cl) {return task.call();} else {t.setContextClassLoader(ccl);try {return task.call();} finally {t.setContextClassLoader(cl);}}}}, acc);} catch (PrivilegedActionException e) {throw e.getException();}}}

默认的线程工厂

    /*** The default thread factory*/static class DefaultThreadFactory implements ThreadFactory {private static final AtomicInteger poolNumber = new AtomicInteger(1);private final ThreadGroup group;private final AtomicInteger threadNumber = new AtomicInteger(1);private final String namePrefix;DefaultThreadFactory() {SecurityManager s = System.getSecurityManager();group = (s != null) ? s.getThreadGroup() :Thread.currentThread().getThreadGroup();namePrefix = "pool-" +poolNumber.getAndIncrement() +"-thread-";}public Thread newThread(Runnable r) {Thread t = new Thread(group, r,namePrefix + threadNumber.getAndIncrement(),0);if (t.isDaemon())t.setDaemon(false);if (t.getPriority() != Thread.NORM_PRIORITY)t.setPriority(Thread.NORM_PRIORITY);return t;}}

捕获访问控制上下文和类加载器的线程工厂

    /*** Thread factory capturing access control context and class loader*/static class PrivilegedThreadFactory extends DefaultThreadFactory {private final AccessControlContext acc;private final ClassLoader ccl;PrivilegedThreadFactory() {super();SecurityManager sm = System.getSecurityManager();if (sm != null) {// Calls to getContextClassLoader from this class// never trigger a security check, but we check// whether our callers have this permission anyways.sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);// Fail fastsm.checkPermission(new RuntimePermission("setContextClassLoader"));}this.acc = AccessController.getContext();this.ccl = Thread.currentThread().getContextClassLoader();}public Thread newThread(final Runnable r) {return super.newThread(new Runnable() {public void run() {AccessController.doPrivileged(new PrivilegedAction<Void>() {public Void run() {Thread.currentThread().setContextClassLoader(ccl);r.run();return null;}}, acc);}});}}

仅公开ExecutorService实现的ExecutorService方法的包装类

    /*** A wrapper class that exposes only the ExecutorService methods* of an ExecutorService implementation.*/static class DelegatedExecutorService extends AbstractExecutorService {private final ExecutorService e;DelegatedExecutorService(ExecutorService executor) { e = executor; }public void execute(Runnable command) { e.execute(command); }public void shutdown() { e.shutdown(); }public List<Runnable> shutdownNow() { return e.shutdownNow(); }public boolean isShutdown() { return e.isShutdown(); }public boolean isTerminated() { return e.isTerminated(); }public boolean awaitTermination(long timeout, TimeUnit unit)throws InterruptedException {return e.awaitTermination(timeout, unit);}public Future<?> submit(Runnable task) {return e.submit(task);}public <T> Future<T> submit(Callable<T> task) {return e.submit(task);}public <T> Future<T> submit(Runnable task, T result) {return e.submit(task, result);}public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)throws InterruptedException {return e.invokeAll(tasks);}public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit)throws InterruptedException {return e.invokeAll(tasks, timeout, unit);}public <T> T invokeAny(Collection<? extends Callable<T>> tasks)throws InterruptedException, ExecutionException {return e.invokeAny(tasks);}public <T> T invokeAny(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException {return e.invokeAny(tasks, timeout, unit);}}
    static class FinalizableDelegatedExecutorServiceextends DelegatedExecutorService {FinalizableDelegatedExecutorService(ExecutorService executor) {super(executor);}protected void finalize() {super.shutdown();}}

仅公开ScheduledExecutorService实现的ScheduledExecutorService方法的包装类

    /*** A wrapper class that exposes only the ScheduledExecutorService* methods of a ScheduledExecutorService implementation.*/static class DelegatedScheduledExecutorServiceextends DelegatedExecutorServiceimplements ScheduledExecutorService {private final ScheduledExecutorService e;DelegatedScheduledExecutorService(ScheduledExecutorService executor) {super(executor);e = executor;}public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {return e.schedule(command, delay, unit);}public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {return e.schedule(callable, delay, unit);}public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {return e.scheduleAtFixedRate(command, initialDelay, period, unit);}public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {return e.scheduleWithFixedDelay(command, initialDelay, delay, unit);}}
    /** Cannot instantiate. */private Executors() {}
}

http://chatgpt.dhexx.cn/article/KvLmOWIW.shtml

相关文章

Executor框架

转载请以链接形式标明出处&#xff1a; 本文出自:103style的博客 Java并发编程的艺术笔记 并发编程的挑战Java并发机制的底层实现原理Java内存模型Java并发编程基础Java中的锁的使用和实现介绍Java并发容器和框架Java中的12个原子操作类介绍Java中的并发工具类Java中的线程池E…

Executor执行器

分为四个模块&#xff1a; 1.动态代理MapperProxy 2.SQL会话SqlSesson 3.执行器Executor 4.JDBC处理器StatementHandler 现讲述为SQL会话与执行器 一、SQL会话SqlSesson 该门面模式提供一个统一的门面接口API 该模式提供的一个基本API为增删改查&#xff0c;还会提供提…

Java并发多线程编程——Executors类

目录 一、Executors的理解二、Executors类图结构二、Executors常用的方法三、线程池的创建分为两种方式&#xff08;主要介绍通过Executors类创建的方式&#xff09;1、newFixedThreadPool方法示例2、newSingleThreadExecutor方法示例3、newCachedThreadPool方法4、newSchedule…

Executors一篇就够

Executors框架包含的内容十分的多&#xff1a;看图&#xff1a; 一、各个接口的作用 按照图示关系进行介绍&#xff1a; Executor 该接口作为顶层接口只有一个execute()方法 execute(Runnable r) 该接口接受一个Runnable实例&#xff0c;即要执行的任务ExecutorService 该…

Executors工具类的相关方法

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生。本篇将记录创建线程池的Executors工具类里面的方法&#xff0c;方便加深知识印象和复习使用。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适合复习中&#xff0c;面试中的大佬&a…

java并发编程:Executor、Executors、ExecutorService

Executors 在Java 5之后&#xff0c;并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的&#xff0c;其内部使用了线程池机制&#xff0c;它在java.util.cocurrent 包下&#xff0c;通过该框架来控制线程的启动、执行和关闭&#xff0c;可以简化…

nlinfit非线性回归拟合

% % 使用指定函数对下述两变量进行曲线拟合 % % yak1*exp(m*t)k2*exp(-m*t); % % 离散点: t[0,4,8,40], % % y[20.09,64.52,85.83,126.75]; % % t-自变量 y-因变量 a,m,k1,k2为常数 % % 用非线性回归nlinfit&#xff0c;如果数据点多些&#xff0c;效果会更好。 脚本&…

matlab的nlinfit函数,用matlab如何进行非线性拟合 nlinfit函数?

用非线性回归nlinfit&#xff0c;如果数据点多些&#xff0c;效果会更好。 function nonlinefit clc;clear; t[0 4 8 40]; y[20.09 64.52 85.83 126.75]; betanlinfit(t,y,myfunc,[1 1 1 1]) abeta(1) k1beta(2) k2beta(3) mbeta(4) tt0:1:40 yyak1*exp(m*tt)k2*exp(-m*tt) plo…

【MATLAB统计分析与应用100例】案例013:matlab读取Excel数据,调用nlinfit函数作一元非线性回归

1. 一元线性回归分析效果预览 2. matlab完整实现代码 %读取数据,绘制散点图** HeadData = xlsread(examp08_02.xls); %从Excel文

matlab中用polyfit、regress、nlinfit等进行详细的回归分析

目录 1.说明2.回归的介绍2-1.前面两篇所发现的一些问题2-1-1.回归和拟合是什么关系?2-1-2.回归到底是做预测还是用来去脏数据?3.三个函数的核心:最小二乘法3-1.介绍3-2.matlab代码4.函数polyfit(线性)5.函数regress(线性)5-1.输出b,bint,r,rint,stats5-2.应用5.2-1.一元…

曲线拟和函数lsqcurvefit nlinfit

转载自&#xff1a;http://panda0411.com/2011/08/29/curve-fit-and-function-lsqcurvefitnlinfit/ 琢磨了好久matlab自带的曲线拟和工具箱, 发现这货只能解决从离散数据得到各种类型的拟和效果, 但是反之貌似没法实现, google一下有这两个函数可以用:lsqcurvefit和nlinfit ls…

Matlab学习手记——非线性数据拟合:nlinfit和lsqcurvefit

目的&#xff1a;通过一个实例了解Matlab的数据拟合函数nlinfit和lsqcurvefit的使用。 结果图 具体数值 p 0.3000 50.0000 0.4000 200.0000 0.3000 800.0000 p1 0.3267 48.3589 0.4030 226.6525 0.2838 809.6680 p2 0.3267 48.3646 0.4031 226.735…

MATLAB多元非线性回归nlinfit拟合圆拟合球拟合函数

先上实验效果&#xff0c;你觉得有帮助可以继续阅读。代码解析在B站有上传视频&#xff08;用户昵称同名&#xff09;&#xff0c;代码也有详细备注。 拟合圆和球面&#xff1a; 拟合多元非线性函数&#xff1a;y p1*x1p2*x1^2p3*x2p4*x2^2exp(-p5*x3)的拟合结果&#xff1a;…

MATLAB 非线性隐函数拟合采坑记录(使用 fsolve solve nlinfit lsqcurvefit函数)

MATLAB 非线性隐函数拟合采坑记录&#xff08;使用 fsolve solve nlinfit lsqcurvefit函数&#xff09; 问题描述解决思路错误示范1代码思路原因解释模型更正更正模型1更正模型2 错误示范2代码思路原因解释模型更正更正模型1更正模型2 总结 问题描述 MATLAB的 nlinfit 和 lsqc…

Matlab多元非线性函数拟合

看了多篇文章&#xff0c;觉得没有一篇比较全&#xff0c;且可以参照的多元非线性函数拟合&#xff0c;看了多篇文章后总结以下内容&#xff0c;主要以示例给出&#xff0c;希望能帮助到大家快速上手。 1.需要用到的函数语法 beta nlinfit(X, Y, modelfun, beta0) X为你的自…

MATLAB中用nlinfit做多元非线性拟合(回归)

MATLAB中有一个多元非线性拟合的功能是nlinfit 基本语法是&#xff1a; beta nlinfit(X,Y,modelfun,beta0) 式子左边的beta可以是一个向量&#xff0c;向量的元素就是要回归的模型中的参数。 式子右边&#xff0c;modelfun是要回归的函数形式。X是函数的自变量数据&#xff1b…

使用nlinfit函数进行拟合时出现Error using nlinfit>checkFunVals (line 611)

在使用nlinfit函数进行拟合时出错&#xff0c;内容如下&#xff1a; The function you provided as the MODELFUN input has returned Inf or NaN values.从第一行可以看出&#xff0c;由于赋予的初始值导致了函数生成了NaN&#xff08;无解&#xff09;&#xff0c;所以整个回…

【数学建模】多元非线性回归nlinfit(Matlab代码实现)

目录 1 基本语法 2 算例及Matlab代码实现 2.1 算例 2.2 数据 2.3 Matlab代码实现 1 基本语法 2 算例及Matlab代码实现 2.1 算例 熔喷非织造材料是口罩生产的重要原材料&#xff0c;具有很好的过滤性能&#xff0c;其生产工艺简单、成本低、质量轻等特点&#xff0c;受到国…

Matlab 使用nlinfit 函数进行多元非线性回归,并且绘制曲线拟合的误差区间

Matlab 使用nlinfit 函数进行多元非线性回归&#xff0c;并且绘制曲线拟合的误差区间 一、前言二、nlinfit函数使用1、函数语法2、拟合示例&#xff1a; 三、误差阴影绘制四、整体源码五、思考参考博客 一、前言 这个也是最近我接到的一个小项目里的内容&#xff1a; 有一组数…

利用nlinfit函数实现数据非线性拟合

所谓“拟合”&#xff0c;指的是在已有一组实验数据的前提下&#xff0c;研究这组数据有怎样的函数关系——最终结果是从这一组看似漫无规律的数据点中“找出”能用数学表达式表示的规律。 用数学语言描述的拟合定义如下&#xff1a; 一个典型的数据拟合过程包括以下几个步骤&…