车驰夜幕|ThreadPoolExecutor线程池实现原理+源码解析( 六 )

ftask = newTaskFor(task, null);execute(ftask);return ftask;}publicFuture submit(Runnable task, T result) {if (task == null) throw new NullPointerException();RunnableFuture ftask = newTaskFor(task, result);execute(ftask);return ftask;}publicFuture submit(Callable task) {if (task == null) throw new NullPointerException();RunnableFuture ftask = newTaskFor(task);execute(ftask);return ftask;}submit方法可以接收线程池返回的结果 , 也就是Futrue对象 , 可以接收Runnable对象和Callable对象 。 至于Future、FutureTask、Runnable、Callable之间的关系 , 博主在前一篇博客 如何获取子线程的执行结果 已经详细介绍过 , 此处不再赘述 。
至此ThreadPoolExecutor的核心方法的源码以及执行逻辑已经讲解完毕 , 再来看一些非核心方法 , 了解一下即可

  • public void shutdown():关闭线程池 , 已经提交过的任务还会执行(线程池中未运行完毕的 , 缓冲队列中的)
  • public List shutdownNow():停止线程池 , 试图停止正在执行的任务 , 暂停缓冲队列中的任务 , 并且返回
  • public void allowCoreThreadTimeOut(boolean value):设置核心线程是否允许回收
  • protected void beforeExecute(Thread t, Runnable r):钩子函数 , 处理线程执行任务前的逻辑 , 这里是空实现
  • protected void afterExecute(Runnable r, Throwable t):钩子函数 , 处理线程执行任务后的逻辑 , 这里是空实现
  • public int getActiveCount():返回正在执行任务的线程的大致数量
  • public long getCompletedTaskCount():返回执行完成的任务的大致数量
除此之外还需要了解的是 , 构造方法中的七个参数 , 除了BlockingQueue是不能动态设置外 , 其余六个参数都可以动态设置 , 分别调用对于的setXxx方法即可 , 当然也可以通过对于的getXxx方法获取对应的信息 。
鉴于此 , 我们再来看一个常见的问题
Java有几种线程池?
JDK(准确的说是java.util.concurrent.Executors工具类)提供了四种线程池:
  • CachedThreadPool:缓冲线程池、
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue());}
  • FixedThreadPool:固定线程数的线程池
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue());}
  • SingleThreadExecutor:单线程的线程池
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue()));}static class FinalizableDelegatedExecutorService extends DelegatedExecutorService {FinalizableDelegatedExecutorService(ExecutorService executor) {super(executor);}
  • ScheduledThreadPool:可定时调度的线程池
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);}// ScheduledThreadPoolExecutor继承了ThreadPoolExecutor , 所以super()还是调用ThreadPoolExecutor的构造方法public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue());}}


推荐阅读