线程池(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 ...
随机推荐
- Linux 基础学习1
目录 Linux 基础学习 用户登录 终端 交互式接口 bash 修改ssh连接慢的步骤 命令提示符 显示提示符格式 命令 别名 命令格式 获取命令的帮助信息 man bash 快捷键 tab 键 引 ...
- Restful api 返回值重复的问题
Spring boot全家桶前后端分离的项目,在扩充某一个列表形式的返回值时,发现返回值出现了一批的重复. 正常的数据返回: 数值完全一致只是参数名称区分了大小写,如下图: 推测可能是restful格 ...
- FreeRTOS二值信号量
API函数 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xSemaphoreCreateBinary() xQueueGenericCre ...
- 【转】VC和VS的区别
各个版本之间的对应关系 使用windows平台搞开发时,下载第三方库时经常会遇到文件名以VCxx版本号命令,VC版本如何转换成对应的VS的版本呢,这里总结一下vc和vs的关系. Microsoft V ...
- LB_Yi
LB_Yi 简述 LB_Yi也是一种比较常见的下界函数,在时间序列的筛选中十分常见.是由Yi在Kim的基础上设计的下界函数. 公式 LB_Yi的公式如下: 从公式中可以明显的看出,其实就是把大于序列最 ...
- Locust 教程
写在 Locust 教程开始的前面 本文参考了: Locust 教程 : https://www.axihe.com/tools/locust/home.html : locust 的官方 Githu ...
- rxjs 入门--环境配置
原文: https://codingthesmartway.com/getting-started-with-rxjs-part-1-setting-up-the-development-enviro ...
- 《奋斗吧!菜鸟》 第九次作业:Beta冲刺 Scrum meeting 1
项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11056511.html 团队名称 奋斗吧!菜鸟 作业学习目标 掌 ...
- 《Exceptioning团队》第四次作业:项目需求调研与分析
一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.探索团队软件项目需求获取技巧与方法2.学会 ...
- HDFS内存配置
下图是HDFS的架构: 从上图中可以知道,HDFS包含了NameNode.DataNode以及Client三个角色,当我们的HDFS没有配置HA的时候,那还有一个角色就是SecondaryNameNo ...