在线程池里提交任务经常见到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区别的更多相关文章

  1. 线程池中 submit()和 execute()方法有什么区别?(未完成)

    线程池中 submit()和 execute()方法有什么区别?(未完成)

  2. Java线程池中submit() 和 execute()方法的区别

    两个方法都可以向线程池提交任务, execute()方法的返回类型是void,它定义在Executor接口中, 而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorS ...

  3. Java线程池中submit()和execute()方法有什么区别

    两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,而submit()方法返回有计算结构的Future对象,它定义在ExecutorServic ...

  4. Java 线程池中 submit() 和 execute()方法有什么区别?

    两个方法都可以向线程池提交任务,execute()方法的返回类型是 void,它定义在 Executor 接口中. 而 submit()方法可以返回持有计算结果的 Future 对象,它定义在 Exe ...

  5. 线程池的submit和execute方法区别

    线程池中的execute方法大家都不陌生,即开启线程执行池中的任务.还有一个方法submit也可以做到,它的功能是提交指定的任务去执行并且返回Future对象,即执行的结果.下面简要介绍一下两者的三个 ...

  6. Java线程池中submit()和execute之间的区别?

    一: submit()方法,可以提供Future < T > 类型的返回值. executor()方法,无返回值. execute无返回值 public void execute(Runn ...

  7. 13.ThreadPoolExecutor线程池之submit方法

    jdk1.7.0_79  在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...

  8. Callable与Runable接口 submit与execute区别

    execute(Runnable x) 没有返回值.可以执行任务,但无法判断任务是否成功完成. submit(Runnable x) 返回一个future.可以用这个future来判断任务是否成功完成 ...

  9. 多线程ExecutorService中submit和execute区别

    submit和execute都是 ExecutorService 的方法,都是添加线程到线程池中. 区别 三个区别: 1.接收的参数不一样 2.submit有返回值,而execute没有 Method ...

随机推荐

  1. orangepi获取cpu温度

    cat /sys/devices/virtual/hwmon/hwmon1/temp1_input

  2. JDK的安装(mac)

    1.第一步安装brew 教学网址 2.用brew安装jdk. brew update brew cask install java(未翻墙时长很长,大概猴年马月两个小时) 安装完成后就可以执行JAVA ...

  3. IDEA 显示Run Dashboard窗口的2种方式

    前言:在基于spring boot构建spring cloud微服务架构的时候,一般需要启动多个应用程序,在idea开发工具中,多个同时启动的应用可以在Run Dashboard运行仪表盘中得到更好的 ...

  4. LFS7.10——构造临时Linux系统

    参考:LFS编译——准备Host系统 前言 在准备好Host环境后,接下来构造一个临时Linux系统.该系统包含****构建所需要的工具.构造临时Linux系统分两步: 构建一个宿主系统无关的新工具链 ...

  5. 开发一个代码的自动生成器,使用Jfinal4.3+Swagger+Sql

    -- 所有表名select column_name 列名, data_type 字段类型, column_comment 字段注释  from information_schema.columns  ...

  6. LOJ#2764. 「JOI 2013 Final」JOIOI 塔

    题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判 ...

  7. md5 32位小写加密源码

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * md5 32位小写加密 ...

  8. Shell排序——软考(五)

    希尔排序是一种插入排序,是对直接插入排序的一种改进,该算法出自于D.L.Shell,因此得名为希尔.Shell排序又名缩小增量排序. 思想      假设初始序列为n个元素,先取一个小于n的整数d1作 ...

  9. test20190526 Noip 模拟赛 4

    调整(tweak) [问题描述] 已给定一个 N个点 M条边的有向图,点编号为1到N,第i条边为 (ui,vi), 权值为 wi. 你可以进行一次操作,使得任意条边的权值变成非负整数.要求进行尽量少的 ...

  10. Title:eNSP 映射到外网

    Title:eNSP 映射到外网 一.系统版本 OS 版本: 10.0.17763 暂缺 Build 17763 eNSP V1.3.00.100 Oracle VM VirtualBox 5.2.2 ...