线程池创建代码示例:
ExecutorService pool = Executors.newFixedThreadPool(5);
List<CallableTest> list = new ArrayList<>();
list.add(new CallableTest("one"));
list.add(new CallableTest("two"));
pool.invokeAll(list);
pool.shutdown();
启动线程池的方式:
pool.invokeAll(list);
pool.submit(list);
pool.execute(new Runnable(){...});
其中invokeAll是会阻塞主线程的,而submit和execute则不会
如上图所示,线程池的启动方式
实现Runnable接口或者Callable接口的区别就是一个有返回值一个没有返回值
当使用submit方法时候,Runnable接口和Callable接口都有返回值了,分析如下:
通过上图可以看出,Runnable通过RunnableAdapter适配成了Callable,最终调用的是Callable的实现方法,返回值则为调用submit方法时传入的参数,不传默认返回null。