安徽做网站公司哪家好网站优化排名易下拉软件
为什么不建议使用Executors创建线程池分析
- 不建议使用Executors来创建线程池,主要是有两大原因第一个是问题回溯的问题,使用Executors都可以使用默认的情况,无法用户自定义线程名称不利于排查问题,第二个原因也是最主要原因就是线程池的队列长度太长在这种情况下可能会导致往队列中不停的添加任务,最终在没有达到队列上线的情况下先把服务器运行的内存资源耗尽导致OOM
- 通过直接使用ThreadPoolExecutor创建线程池,设置相对复杂但是设置相对灵活很多。在开发中可以自定义一个Executors,来创建线程池,在语义相同的情况下增加参数来避免前面说的问题
- Executors也是可以用来创建,但是需要考虑不同的场景。
作者:蚂蚁背大象
链接:https://juejin.cn/post/7064161230885224462
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Executor框架
Java并发——Executor框架详解(Executor框架结构与框架成员)
Callable 和 Runable
Java 8 并发教程:Threads和Executors
原文:Java 8 Concurrency Tutorial: Threads and Executors
译者:BlankKelly
来源:Java8并发教程:Threads和Executors
两种提交方式 submit和execute
submit如果输入runable,会重新再调回execute
https://zhuanlan.zhihu.com/p/559735913
https://zhuanlan.zhihu.com/p/642309734
Executors支持通过invokeAll()一次批量提交多个callable。这个方法结果一个callable的集合,然后返回一个future的列表。
ExecutorService executor = Executors.newWorkStealingPool();
List<Callable<String>> callables = Arrays.asList(() -> "task1",() -> "task2",() -> "task3");
executor.invokeAll(callables).stream().map(future -> {try {return future.get();}catch (Exception e) {throw new IllegalStateException(e);}}).forEach(System.out::println);
在这个例子中,我们利用Java8中的函数流(stream)来处理invokeAll()调用返回的所有future。我们首先将每一个future映射到它的返回值,然后将每个值打印到控制台。如果你还不属性stream,可以阅读我的Java8 Stream 教程。