转载请注明出处 http://www.paraller.com
原文排版地址 点击跳转-任务执行/)缓存
任务执行
来构造的,经过将任务分红小的工做单元
,提供一种天然的事务边界
来优化错误恢复过程.独立性
和明确的任务执行策略
无限制建立线程的不足并发
内存
;可运行的线程数量多于CPU的数量将会形成闲置,占用内存,大量线程还会引发竞争Thread构造函数指定的栈大小
,以及系统对线程的限制都会形成崩溃。Note:
32位的机器,限制因素主要是线程栈的地址空间,每一个线程维护两个执行栈,一个用于Java代码,一个用于原生代码,一般JVM会默认建立一个复合栈,大概是0.5兆(经过 -Xss或者Thread构造函数来设置),2的32次方除以栈大小,会将线程限制在几万内。异步
工做单元
, 而线程
则是任务异步执行的机制
Runnable
表示任务interface Executor{ void execute(Runnable command); }
class Demo{ private final Executor exec = Executors.newFixedThreadPool(100); void test(){ // 运行 Runnable task = new Runnable(){ public void run(){ //... } } // 提交 exec.execute(task); } }
经过管理一组工做线程的资源池,可以减小建立和销毁的开销(资源层面),而且不须要等待,提升响应性
Executor静态工厂方法提供如下几种资源池:函数
Executor实现一般建立线程执行,JVM只有在全部的非守护线程结束才能关闭,
类库提供了 基于 Executor的 ExecutorService接口性能
不接受新任务
,等待开始的任务结束还没有开始
(多是已接受的新任务)执行的任务。interface ExecutorService extends Executor{ void shutdown(); List<Runnable> shutdownNow(); boolean isShutdown(); ...// }
生命周期三种状态 运行、关闭、已终止优化
RejectExecutionException
Timer负责管理 延迟任务 和 周期任务;缺陷以下:线程
若是要构建本身的调度器,能够使用DelayQueue和ScheduledThreadPoolExecutor组合。code
class Demo{ final ExecutorService executor; void test(){ CompletionService cs = new ExecutorCompletionService(executor); for(...){ cs.submit(new Callable(){ //... }); } for(...){ // 返回的都是已经计算好结果的Callable Future<T> future = cs.take(); future.get(); } } }