线程池(6)-submit与execute区别
在线程池里提交任务经常见到submit与execute,如何选择,傻傻分不清楚。那么他们俩有什么区别,使用场景是什么?这篇博客将会介绍。
1.方法定义
void execute(Runnable command);
Future<T> submit(Callable<T> task);
Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
2.使用上的区别
2.1execute没有返回值(Future)
2.2执行结果(future.get)
2.3submit可以捕获runnable里的异常
3.示例
3.1使用Future判断任务是否执行完,5s后任务超时就停止任务。
public class ThreadPoolSubmitFuture {
static class MyRunnable implements Runnable { private String jobName;
private Thread nowThread; MyRunnable(String jobName) {
this.jobName = jobName;
} public void setInterrupted() {
nowThread.interrupt();
} @Override
public void run() {
nowThread = Thread.currentThread();
try {
while (true) {
Thread.sleep();
// 写了sleep就不用再判断isInterrupted()了
System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName);
}
} catch (InterruptedException e) {
System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName + "马上停止");
e.printStackTrace();
}
}
} public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newFixedThreadPool(, new MyThreadFactory());
MyRunnable job1 = new MyRunnable("job-1");
Future<?> f = es.submit(job1); try {
f.get(, TimeUnit.SECONDS);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
// 超时停止
job1.setInterrupted();
e.printStackTrace();
}
try {
f.get();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
3.2执行结果
MyRunnable不变
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newFixedThreadPool(, new MyThreadFactory());
MyRunnable job1 = new MyRunnable("job-1");
Future<String> f = es.submit(job1, "我执行完了"); try {
f.get(, TimeUnit.SECONDS);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
// 超时停止
job1.setInterrupted();
e.printStackTrace();
}
try {
String rs = f.get();
System.err.println("job-1执行完后,说了啥:" + rs);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
3.3捕获异常
在Runnale中可以抛出RuntimeException,不可以抛出Exception
public class ThreadPoolSubmitFutureException {
static class MyRunnable implements Runnable { private String jobName;
private Thread nowThread; MyRunnable(String jobName) {
this.jobName = jobName;
} public void setInterrupted() {
nowThread.interrupt();
} @Override
public void run() {
nowThread = Thread.currentThread();
try {
while (true) {
Thread.sleep();
// 写了sleep就不用再判断isInterrupted()了
System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName);
}
} catch (InterruptedException e) {
System.err.println("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName + "马上停止");
e.printStackTrace();
throw new RuntimeException("当前线程:" + Thread.currentThread().getName() + " 当前任务:" + jobName + " 我出现异常了");
}
}
} public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newFixedThreadPool(, new MyThreadFactory());
MyRunnable job1 = new MyRunnable("job-1");
Future<?> f = es.submit(job1); try {
f.get(, TimeUnit.SECONDS);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
// 超时停止
job1.setInterrupted();
e.printStackTrace();
}
try {
f.get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (RuntimeException re) {
re.printStackTrace();
}
}
}
3.4异常不捕获会怎么样
execute会导致执行的线程销毁,线程池会重新创建一个新的线程来执行其他任务,这样就会导致线程池的线程得不到复用。
submit不会导致执行的线程销毁,但是你不future.get()你永远不会知道这个异常。
4.总结
4.1如果任务有返回值,有抛出异常,使用submit
4.2如果要判断任务执行完,以便进行其他处理,使用submit
4.3使用submit抛出的异常,不捕获将不会知道有这个异常
线程池(6)-submit与execute区别的更多相关文章
- 线程池中 submit()和 execute()方法有什么区别?(未完成)
线程池中 submit()和 execute()方法有什么区别?(未完成)
- Java线程池中submit() 和 execute()方法的区别
两个方法都可以向线程池提交任务, execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorS ...
- Java线程池中submit()和execute()方法有什么区别
两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,而submit()方法返回有计算结构的Future对象,它定义在ExecutorServic ...
- Java 线程池中 submit() 和 execute()方法有什么区别?
两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在 Executor 接口中. 而 submit()方法可以返回持有计算结果的 Future 对象,它定义在 Exe ...
- 线程池的submit和execute方法区别
线程池中的execute方法大家都不陌生,即开启线程执行池中的任务.还有一个方法submit也可以做到,它的功能是提交指定的任务去执行并且返回Future对象,即执行的结果.下面简要介绍一下两者的三个 ...
- Java线程池中submit()和execute之间的区别?
一: submit()方法,可以提供Future < T > 类型的返回值. executor()方法,无返回值. execute无返回值 public void execute(Runn ...
- 13.ThreadPoolExecutor线程池之submit方法
jdk1.7.0_79 在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...
- Callable与Runable接口 submit与execute区别
execute(Runnable x) 没有返回值.可以执行任务,但无法判断任务是否成功完成. submit(Runnable x) 返回一个future.可以用这个future来判断任务是否成功完成 ...
- 多线程ExecutorService中submit和execute区别
submit和execute都是 ExecutorService 的方法,都是添加线程到线程池中. 区别 三个区别: 1.接收的参数不一样 2.submit有返回值,而execute没有 Method ...
随机推荐
- Python接口自动化基础---token鉴权
有些登录使用cookie,有些登录需要token验证,token传参一般有两种形式,一种是在请求头中,一种是使用URL传参 这里举例说明一下请求头中的token方式: #登录 param1={'use ...
- 【洛谷 P4248】 [AHOI2013]差异(后缀自动机)
题目链接 \[ans=\sum_{1<=i<j<=n}len(T_i)+len(T_j)-2*lcp(T_i,T_j)\] 观察这个式子可以发现,前面两个\(len\)是常数,后面的 ...
- 【阿里云开发】- 安装tomcat
Tomcat配置过程 1.下载Tomcat 官网地址:http://tomcat.apache.org/ 这里我用的是apache-tomcat-8.5.38.tar.gz 2.通过ftp工具将下载好 ...
- EasyUI DataGrid 根据ID选中行(转载)
转载来源: https://blog.csdn.net/chq00788/article/details/51505519 function selectRows(){ //获取需要选中的记录ID ...
- Java中数组的定义,初始化和使用
定义:数组是数据类型相同的,用一个标志符名称封装在一起的一个对象序列或基本类型数据序列(一组相同数据类型元素的集合,并且分配一块连续的内存来存储). 格式:int[] a1(常用) 或者 int a ...
- 过滤器实现Token验证(登录验证+过期验证)---简单的实现
功能:登录验证+过期验证+注销清除cookie+未注销下关闭或刷新浏览器仍可直接访问action概述:token只存在客户端cookie,后端AES加密+解密+验证,每一次成功访问action都会刷新 ...
- mybatis返回map类型数据空值字段不显示的解决方法
在日常开发中,查询数据返回类型为map,数据库中有些自动值为null,则返回的结果中没有值为空的字段,则如何显示值为空的字段呢? Spring boot + MyBatis返回map中null值默认不 ...
- angularcli 第三篇(数据循环*ngFor、条件判断*ngIf)
1.数据循环 *ngFor (1)普通循环 <ul> <li *ngFor = "let item of list" > {{ item }} </l ...
- SecureCRT中文乱码解决已设置UTF-8了
参考网址:http://www.iitshare.com/securecrt-chinese-garbled-solution.html 问题描述 SecureCRT与SecureFX的常规选项里面已 ...
- FSMN 及其变种 cFSMN DFSMN pyramidal-FSMN
原文: https://blog.csdn.net/qq_26778411/article/details/89682447 也可以参考: http://vsooda.github.io/2018/ ...