在线程池里提交任务经常见到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. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  2. mongoose 警告信息 { useNewUrlParser: true } { useUnifiedTopology: true }

    问题: 解决:

  3. ZYNQ block design警告:[BD 41-968] AXI interface port /axi_lite4 is not associated to any clock port. It may not work correctly.

    前言 在Block design中引出AXI接口给外部,检查设计告警如下: [BD 41-968] AXI interface port /axi_lite4 is not associated to ...

  4. 【干货】小程序内嵌 H5 代码详解

    自从微信小程序发布了 web-view 组件,使得之前的 H5 网站移植到小程序成为可能.现在,很多项目在迁移的过程中遇到了许多问题,本文通过实例代码,为你讲解迁移过程中的几个典型场景. 1.小程序和 ...

  5. [转].net mvc + vuejs 的项目结构

    .net项目结构: 程序目录结构: vue操作: 前提:安装npm ,vue,vue-cli 1.进入控制台窗口 2.进入程序目录 3.运行 vue init webpack webjs 生成webj ...

  6. iOS加解密最重要的干货:CCCrypt

    需要引入框架#import <CommonCrypto/CommonCryptor.h> 函数定义: CCCryptorStatus CCCrypt( CCOperation op, /* ...

  7. es6 javascript的Class 类的继承

    原文链接:https://blog.csdn.net/qq_30100043/article/details/53542531 1 基本用法 Class 之间可以通过extends关键字实现继承, 这 ...

  8. typescript 参数类型

    1.参数类型:在参数名称后面使用冒号来指定参数的类型 var myname:string = 'wzn' => "use strict"; var myname = 'wzn ...

  9. Systemweaver — 电子电气协同设计研发平台

            当前电子电气系统随着功能安全.AutoSAR.车联网.智能驾驶等新要求,导致其复杂性.关联性日益上升.当前,传统基于文档的设计由于其低复用性.无关联性.无协同性等缺点,已经无法适应日益 ...

  10. mysql 截取字符串 函数

    文章摘取自http://www.cnblogs.com/zdz8207/p/3765073.html 练习截取字符串函数(五个) mysql索引从1开始 一.mysql截取字符串函数 1.left(s ...