Java 线程池
首先来跑一个最简单的线程池例子:
public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.submit( ()-> {System.out.println("1");}); }
上面是一个最简单的固定线程池的例子。起了容量为10 的线程池;
看 上面你的图 Java 提供的 线程池的方法。
newFixedThreadPool 得到的是一个固定的线程池,可以定指定 线程工厂 指定线程的创建过程;
newFixedThreadPool 返回的是一个 ThreadPoolExecutor 对象,这个对象的 AbstractExecutorService 的 子类 ,AbstractExecutorService 是 ExecutorService 的 抽象类。
所以继承关系 ThreadPoolExecutor -->AbstractExecutorService -->ExecutorService ->Executor
ThreadPoolExecutor 这个类和很关键 里面有大量的关系线程池的属性
corePoolSize 核心线程数,maximumPoolSize 最大的线程数,keepAliveTime 线程活多久 会被销毁,unit 时间 单位,
workQueue 工作队列需要 特殊说明一下,这个是线程池队列的工作方式,链表,数组,延时队列或者优先级队列什么的。
这个篇文章介绍的还比较详细:https://www.cnblogs.com/KingIceMou/p/8075343.html
RejectedExecutionHandler handler 顾名之意 在线程池拒绝加入新任务的时候应该怎么办,默认的直接排除拒绝异常
Executors.newCachedThreadPool() 得到一个 初始 大小0 ,最大 Integer.MAX_VALUE 的 一个线程池,需要注意的这个对象,只要请求线程的时候没有可用线程,就会自动扩容。相当于无限线程池。但是他会回收 10 秒没有任务的线程。
Executors.newFixedThreadPool(nThreads) 固定大小的线程池。不会回收空闲线程
Executors.newScheduledThreadPool(corePoolSize) 这是一个可以定时的线程池。可以定时执行 线程对象,下面的图可以看待产生的对象都不一样了。请求实现了定时借口 ,
实现了 ScheduledExecutorService 接口 , schedule 定时方法,也就是 说这个线程会在 延时 一定时间后执行。
Executors.newSingleThreadExecutor() 一个单线程的线程池。
Executors.newSingleThreadScheduledExecutor() 可以定时的 单线程 线程池。
Executors.newWorkStealingPool() 这个是jdk 7 新添加的 根据cpu 的数量来创建的线程池。
ExecutorService 可以加入一个 执行 一个线程
参数可以 Runnable 也可以是 Callable<T> task ,区别是有没有返回。 返回值 Future 对象 get 方法是阻塞 的,需要等待线程返回才能得到。
线程池 需要手动调用 e.shutdown(); 或者 e.shutdownNow() 销毁。区别在于e.shutdown(); 会执行完未执行 完成的任务。 e.shutdownNow() 会让正在执行的线程抛出 打断 interrupt 异常。然后终止。
掉了shutdown之类的方法线程池的状态就变 e.isShutdown() 为 true,但是这时 的 isTerminated() 可能还是 false 需要等 所有线程都子线程都终止了才是 isTerminated() 才是true。
能耍的时候就一定要耍,不能耍的时候一定要学。
--天道酬勤,贵在坚持posted on 2018-07-09 16:18 zhangyukun 阅读(133) 评论(0) 编辑 收藏 举报