线程池提交任务的两种方式:execute与submit的区别
Java中的线程池在进行任务提交时,有两种方式:execute和submit方法。


一、execute和submit的区别
- execute只能提交Runnable类型的任务,无返回值。submit既可以提交Runnable类型的任务,也可以提交Callable类型的任务,会有一个类型为Future的返回值,但当任务类型为Runnable时,返回值为null。
- execute在执行任务时,如果遇到异常会直接抛出,而submit不会直接抛出,只有在使用Future的get方法获取返回值时,才会抛出异常。
测试代码:
package com.javaBase.LineDistancePond; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 〈一句话功能简述〉;
* 〈execute与submit的区别〉
*
* @author jxx
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class TestThreadPoolBegin { public static void main(String[] args) throws Exception{
ExecutorService es = Executors.newSingleThreadExecutor();
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable线程处理开始...");
int a = 0;
int b = 3;
System.out.println("除以0的结果为:" + b/a);
System.out.println("Runnable线程处理结束...");
}
};
es.execute(runnable);
es.shutdown();
}
}
执行结果:
Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
Runnable线程处理开始...
at com.javaBase.LineDistancePond.TestThreadPoolBegin$1.run(TestThreadPoolBegin.java:24)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745) Process finished with exit code 0
package com.javaBase.LineDistancePond; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 〈一句话功能简述〉;
* 〈execute与submit的区别〉
*
* @author jxx
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class TestThreadPoolBegin { public static void main(String[] args) throws Exception{
ExecutorService es = Executors.newSingleThreadExecutor();
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable线程处理开始...");
int a = 0;
int b = 3;
System.out.println("除以0的结果为:" + b/a);
System.out.println("Runnable线程处理结束...");
}
};
es.submit(runnable);
es.shutdown();
}
}
执行结果:
Runnable线程处理开始... Process finished with exit code 0
package com.javaBase.LineDistancePond; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; /**
* 〈一句话功能简述〉;
* 〈execute与submit的区别〉
*
* @author jxx
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class TestThreadPoolBegin { public static void main(String[] args) throws Exception{
ExecutorService es = Executors.newSingleThreadExecutor();
Callable callable = new Callable() {
@Override
public Object call() throws Exception {
System.out.println("线程处理开始...");
int a = 0;
int b = 3;
System.out.println("除以0的结果为:" + b/a);
System.out.println("线程处理结束...");
return "0";
}
};
Future<String> future = es.submit(callable);
System.out.println("任务执行完成,结果为:" + future.get());
}
}
执行结果:
Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at com.javaBase.LineDistancePond.TestThreadPoolBegin.main(TestThreadPoolBegin.java:32)
Caused by: java.lang.ArithmeticException: / by zero
at com.javaBase.LineDistancePond.TestThreadPoolBegin$1.call(TestThreadPoolBegin.java:26)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
线程处理开始...
二、submit的get方法
future的get方法在未获得返回值之前会一直阻塞,我们可以使用future的isDone方法判断任务是否执行完成,然后再决定是否get,因此上述代码我们可以优化如下:
package com.javaBase.LineDistancePond; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; /**
* 〈一句话功能简述〉;
* 〈execute与submit的区别〉
*
* @author jxx
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class TestThreadPoolBegin { public static void main(String[] args) throws Exception{
ExecutorService es = Executors.newSingleThreadExecutor();
Callable callable = new Callable() {
@Override
public String call() throws Exception {
System.out.println("线程处理开始...");
int a = 2;
int b = 3;
System.out.println("3/2的结果为:" + b/a);
System.out.println("线程处理结束...");
return "0";
}
};
Future<String> future = es.submit(callable);
while(true) {
//idDone:如果任务已完成,则返回 true。 可能由于正常终止、异常或取消而完成,在所有这些情况中,此方法都将返回 true。
if(future.isDone()) {
System.out.println("任务执行完成:" + future.get());
break;
}
}
es.shutdown();
}
}
执行结果:
线程处理开始...
3/2的结果为:1
线程处理结束...
线程执行完成:0 Process finished with exit code 1
线程池提交任务的两种方式:execute与submit的区别的更多相关文章
- spark application提交应用的两种方式
bin/spark-submit --help ... ... --deploy-mode DEPLOY_MODE Whether to launch the driver program loc ...
- java中实现同步的两种方式:syschronized和lock的区别和联系
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...
- SpringMVC实现Action的两种方式以及与Struts2的区别
4.程序员写的Action可采用哪两种方式? 第一.实现Controller接口第二.继承自AbstractCommandController接口 5.springmvc与struts2的区别? 第一 ...
- iOS两种方式加载图片的区别
加载图片的方式: imageNamed: imageWithContentsOfFile: 加载Assets.xcassets这里面的图片: 1> 打包后变成Assets.car 2> 拿 ...
- HTTP请求的两种方式get和post的区别
1,get从服务器获取数据:post向服务器发送数据: 2,安全性,get请求的数据会显示在地址栏中,post请求的数据放在http协议的消息体: 3,从提交数据的大小看,http协议本身没有限制数据 ...
- Virsh中创建虚拟机两种方式define和create的区别
本质上两者一样的,都是从xml配置文件创建虚拟机 define 丛xml配置文件创建主机但是不启动 create 同样是丛xml配置文件创建主机,但是可以指定很多选项,比如是否启动,是否连接控制台 ...
- (并发编程)进程池线程池--提交任务2种方式+(异步回调)、协程--yield关键字 greenlet ,gevent模块
一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用“池”:池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务 ...
- Android提交数据到服务器的两种方式四种方法
本帖最后由 yanghe123 于 2012-6-7 09:58 编辑 Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方 ...
- [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]
[操作系统知识储备,进程相关概念,开启进程的两种方式.进程Queue介绍] 操作系统知识回顾 为什么要有操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作 ...
随机推荐
- mysql安装后,过一段时间,在命令行无法启动
这种问题主要是MYsql没有启动起来,可以在启动管理中开启mysql此服务即可解决
- VBS病毒实验
实验目的 探讨VBS病毒实现原理,为更好的深入防御和查杀病毒 实验原理 VBS病毒发生机理 实验内容 编写简单VBS病毒,并实现功能,学习VBS病毒发生机理 实验环境描述 VPC1(虚拟PC) 操作系 ...
- Smartbi代替Alteryx+Tableau,用1份投入如何获得2份回报?
Smartbi是国内一家知名的BI厂商,Alteryx.Tableau是国外两款重要的BI工具,它们都是在BI领域内提供特定的功能,以满足企业的数据分析需求.那么,对于用户来说,在选择BI工具的时候要 ...
- 苹果如何控制android手机,安卓手机怎么控制苹果?
小编经常通过手机远程控制别人手机,帮助他人解决一些电脑问题,另外还经常需要通过远程电脑控制服务器,管理脚本之家的服务器等等,可能这些对大家都没有什么诱惑,今天笔者为大家带来一个非常有趣的手机控制电脑的 ...
- C# Event 内核构造 |EventWaitHandle、AutoResetEvent、 ManualResetEvent
EventWaitHandle 继承:Object->WaitHandle-> EventWaitHandle派生:System.Threading.AutoResetEvent\Syst ...
- C#析构函数(方法)
析构方法是在垃圾回收.释放资源时使用的.析构函数用于析构类的实例.备注: 不能在结构中定义析构函数.只能对类使用析构函数. 一个类只能有一个析构函数. 无法继承或重载析构函数. ...
- C# CLR简介
(一)CLR介绍 CLR是一个可以由多编程语言使用的运行时,CLR的核心功能:内存管理,程序集加载,安全性,异常处理,线程同步等等.可以被很多属于微软系列的开发语言使用. 事实上,在运行时,CLR根 ...
- 基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码)
基于Netty的一个WeoSocket通信服务器与客户端代码(非JS代码) 咳咳,在这里呢,小轩就不多说什么是WebSocket的,还有呢,小轩为什么不给出JS-Client代码?网上太多代码可以用了 ...
- VS Code nodejs智能补全typings
安装typings node.js自动补全使用npm全局安装typings npm install -g typings -安装语法插件以安装node.js自动补全为例,在项目根目录下使用bash或者 ...
- JZ-071-把数字翻译成字符串
把数字翻译成字符串 题目描述 给定一个数字,按照如下规则翻译成字符串:1 翻译成"a",2 翻译成"b"... 26 翻译成"z".一个数字 ...