《ExecutorService-10个要诀和技巧》读后总结

译文:http://www.importnew.com/20263.html 原文:http://www.nurkiewicz.com/2014/11/executorservice-10-tips-and-tricks.htmlhtml

不转发全文了,写点本身的观点java

第一点很强烈使用。无论用什么方式,最好都对本身的线程命名,这对调试颇有帮助。你应该知道不使用 Google Guava 的状况下如何自定义线程池中的线程。固然,实际开发中最好能用 Guava 就用,减小重复代码。git

第二点是进阶的线程命名技巧,能用最好,可是我不知道对实际工做的帮助有多大,确定是对调试有点用的。github

第三点,使用线程池必定要知道 shutdown 和 shutdownNow 的异同,根据状况选择使用spring

第四点,线程中断机制必定要了解,很少解释框架

第五点,线程池队列必定要保持优先长度,默认的20亿太大了。而且最好能监控异步

第六点,正常状况使用线程池不少人都会,报异常以后怎么处理就未必了。开发人员须要知道使用 execute 执行任务如何处理异常,使用 submit 执行任务如何处理异常。在这一点上,即使是 Spring 框架也会犯错。看看 Spring 4.0 中 @Async 任务是如何处理异常的,答案是没处理,从新抛出来。问题是在使用 @Async 注解实现异步任务的场景中,又有谁会执行 Future.get() 来获得从新抛出的异常呢?因此,稍不注意,异常就静悄悄地丢了。Spring 4.1 以后改进了这个问题,感兴趣的能够看一下 Spring 的源代码:https://github.com/spring-projects/spring-framework/blob/4.0.x/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionInterceptor.java线程

因此,不管是使用原生的线程池仍是 Spring 的线程池,都须要了解线程池中异常的处理机制。翻译

注:这一段译文翻译有错调试

第七点,监控任务在队列中等待的时间

第八点,可能80%状况下不用这么作也能解决问题,可是剩下20%可能就须要这种方法帮助你更好地调试程序

第九点,其实我对 CompletableFuture 并不感冒,方法太多了,看的头晕。我更喜欢 Guava 和 Spring 里的 ListenableFuture。不过 CompletableFuture 毕竟是 JDK 提供的,并且做者仍是大名鼎鼎的 Doug Lea,看来只怪本身学艺不精了。

第十点,不作解释,感兴趣能够看看源代码

相关文章
相关标签/搜索