线程池ThreadPoolExecutor的submit方法
2018-01-27 17:04
375 查看
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
三个重载方法,第一个很好理解,传入callable,本身call函数就有一个返回值,可以正常取得。
第二个第三个就不清楚怎么可以取到返回值了,因为Runnable本身的run方法也没有返回值,为什么要这么做,如果没有返回值,直接用execute方法就好,为什么还要下面这几个submit方法呢。
输出:
submit提交的任务,正常执行,返回的是null,不清楚有什么意义
任务里抛出异常,返回值可以get到该异常,继续抛出,不懂。
输出:
输出:
结论:终于还是没搞懂,这两个函数的使用场景是什么。
觉得应该是:
execute提交runnable执行就好
submit提交callable,取得返回值就好
为什么要submit提交runnable呢
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
三个重载方法,第一个很好理解,传入callable,本身call函数就有一个返回值,可以正常取得。
第二个第三个就不清楚怎么可以取到返回值了,因为Runnable本身的run方法也没有返回值,为什么要这么做,如果没有返回值,直接用execute方法就好,为什么还要下面这几个submit方法呢。
package thread.pool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class PoolTest { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); Future<?> submit = executor.submit(new Runnable(){ @Override public void run() { System.out.println("hehe"); } }); try { System.out.println(submit.get()); } catch (Exception e) { } } }
输出:
hehe null
submit提交的任务,正常执行,返回的是null,不清楚有什么意义
package thread.pool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class PoolTest { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); Future<?> submit = executor.submit(new Runnable(){ @Override public void run() { System.out.println("how"); throw new RuntimeException("hehe"); } }); try { Object obj = submit.get(); System.out.println(obj); } catch (Exception e) { System.out.println(e.getMessage() + " exception"); } } }
how java.lang.RuntimeException: hehe exception
任务里抛出异常,返回值可以get到该异常,继续抛出,不懂。
package thread.pool; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; public class PoolTest { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); FutureTask<String> ft = new FutureTask<String>(new Callable<String>(){ @Override public String call() throws Exception { return "hehe"; } }); Future<?> submit = executor.submit(ft); try { ; System.out.println("1" + submit.get()); System.out.println("2" + ft.get()); } catch (Exception e) { System.out.println(e.getMessage() + " exception"); } executor.shutdown(); } }
输出:
1null 2hehe
package thread.pool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class PoolTest { static String aa = "he"; public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); Future<?> submit = executor.submit(new Runnable(){ @Override public void run() { System.out.println("how"); aa = aa + "he"; } },aa); try { System.out.println(submit.get()); } catch (Exception e) { } } }
输出:
how he
结论:终于还是没搞懂,这两个函数的使用场景是什么。
觉得应该是:
execute提交runnable执行就好
submit提交callable,取得返回值就好
为什么要submit提交runnable呢
相关文章推荐
- 13.ThreadPoolExecutor线程池之submit方法
- 简单谈谈ThreadPoolExecutor线程池之submit方法
- 线程池 submit 方法结合 Callable Future 的使用
- 线程池的submit和execute方法区别
- 线程池的submit和execute方法区别
- Java中通过Executors调用静态方法来提供四种线程池介绍
- DOM/jQuery的submit() 方法失效的解决方案
- spring-boot 方法异步调用,自定义线程池配置使用
- 利用ace的ACE_Task等类实现线程池的方法详解
- android线程池的使用方法和原理
- 详谈Java几种线程池类型介绍及使用方法
- [转]几种开源Java Web容器线程池的实现方法简介—Tomcat(一)
- 浅谈线程池及submit()和execute()的区别
- Java 线程池的常用方法分析
- ModelAndView: materialized View is [null];和Action的onSubmit()方法不被执行
- selenium 之 submit()方法
- spring-boot 线程池 @Async 的使用、自定义Executor的配置方法
- Executors的工厂方法提供的5种不同的线程池
- jquery.validate和onsubmit() 同时使用的方法
- 使用线程池的方法(非TPL)-ThreadPool.QueueUserWorkItem