一、.ExecutorService中submit和execute的区别
三个区别:
1、接收的参数不一样
2、submit有返回值,而execute没有
Method submit extends base method Executor.execute by creating and returning a Future that can be used to cancel execution and/or wait for completion.
用到返回值的例子,比如说我有很多个做validation的task,我希望所有的task执行完,然后每个task告诉我它的执行结果,是成功还是失败,如果是失败,原因是什么。然后我就可以把所有失败的原因综合起来发给调用者。
个人觉得cancel execution这个用处不大,很少有需要去取消执行的。
而最大的用处应该是第二点。
3、submit方便Exception处理
There is a difference when looking at exception handling. If your tasks throws an exception and if it was submitted with execute this exception will Go to the uncaught exception handler (when you don't have provided one explicitly, the default one will just print the stack trace to System.err). If you submitted the task with submit any thrown exception, checked or not, is then part of the task's return status. For a task that was submitted with submit and that terminates with an exception, the Future.get will rethrow this exception, wrapped in an ExecutionException.
意思就是如果你在你的task里会抛出checked或者unchecked exception,而你又希望外面的调用者能够感知这些exception并做出及时的处理,那么就需要用到submit,通过捕获Future.get抛出的异常。
public class ExecutorServiceTest { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); List<Future<String>> resultList = new ArrayList<Future<String>>(); // 创建10个任务并执行 for (int i = 0; i < 10; i++) { // 使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中 Future<String> future = executorService.submit(new TaskWithResult(i)); // 将任务执行结果存储到List中 resultList.add(future); } executorService.shutdown(); // 遍历任务的结果 for (Future<String> fs : resultList) { try { System.out.println(fs.get()); // 打印各个线程(任务)执行的结果 } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { executorService.shutdownNow(); e.printStackTrace(); return; } } } }
二、ExecutorService对象的shutdown和shutdownNow的区别
可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown() 方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService 以允许回收其资源。
三、关于Future.get()方法。
如果执行该方法,就阻塞并等待线程返回结果,才会继续向下执行其他代码;
如果没有该方法,则代码直接向下执行。至于线程什么时候执行完,是不知道的。
相关推荐
综上所述,Java多线程编程涵盖了线程的创建、执行和管理等多个层面,理解并熟练掌握这些要点对于编写高效并发程序至关重要。在实际开发中,还需要考虑线程安全、同步机制、死锁等问题,以确保程序的正确性和性能。
1. Java多线程学习(一)Java多线程入门 2. Java多线程学习(二)synchronized关键字(1) 3. Java多线程学习(二)...8. Java多线程学习(七)并发编程中一些问题 9. Java多线程学习(八)线程池与Executor 框架
本文将详细介绍Java多线程的基础知识、应用场景以及编程实践,旨在帮助初学者快速掌握多线程编程的核心概念和技术要点。 #### 二、Java多线程基础 ##### 1. 线程的概念 线程是程序执行流的最小单元,是操作系统能够...
Java多线程技术在爬虫应用中的重要性不言而喻,它能显著提升图片抓取的效率。本文将深入探讨如何使用Java实现多线程爬虫,以及压缩包中的三个示例案例。 首先,我们需要了解Java中的多线程概念。在Java中,通过创建...
本文将详细讲解Java多线程程序编写的要点,包括线程的状态控制、优先级以及线程间通信。 首先,线程有五种基本状态:新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)和死亡状态...
总结来说,Java多线程技术在网络通信系统中的应用包括了线程间通信的原理、多线程实现网络通信的原理、线程安全及同步控制的有效途径,以及网络通信编程中的Socket类实现。掌握这些技术要点,对于进行高效、稳定、...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了效率。在本项目"java多线程实现-tcp端口扫描"中,我们利用多线程技术来加速...这就是"java多线程实现-tcp端口扫描"项目的核心技术要点。
多线程设计是Java编程中不可或缺的一部分,尤其在并发编程中起到至关重要的作用。以下是对多线程设计要点的详细讲解: 1. **内存模型**:JVM内存分为主内存和工作内存。主内存存储所有线程共享的数据,而工作内存则...
### Java多线程实现控制台聊天室 #### 一、项目概述 本项目采用Java语言,利用多线程技术实现了一个简单的控制台聊天室。该聊天室具备基本的客户端与服务器端交互功能,用户可以通过控制台窗口进行文字聊天交流。 ...
在深入探讨Java多线程与并发库的高级应用之前,我们首先需要回顾一下Java多线程的基础概念和技术要点。 ##### 1.1 线程的概念 在计算机科学中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是...
Java多线程编程是Java开发中的一项重要技术,它允许程序同时执行多个任务,提高了系统效率和响应速度。然而,多线程环境下的编程也带来了一些挑战,如数据同步、线程安全等问题。本文将重点讨论Java多线程编程中需要...
### Java多线程编程教程知识点概述 #### 一、操作系统中的线程与进程概念 - **进程**: 进程是操作系统进行资源分配和调度的基本单位,每个...通过这些知识点的学习,可以更好地理解和掌握Java多线程编程的技术要点。
### Java多线程+Socket实现的漂亮QQ #### 技术要点分析 ##### 1. Java Swing Java Swing 是一个用于构建图形用户界面 (GUI) 的轻量级组件集,它为开发人员提供了丰富的功能来设计复杂的用户界面。在本项目中,...
### Java多线程相关知识总结 #### 一、基本概念 多线程是现代编程语言中一项非常重要的特性,尤其在Java...以上就是关于Java多线程的基础知识总结,希望能帮助大家更好地理解和掌握Java多线程的相关概念和技术要点。
### Java实现FTP多线程断点续传:深入解析与技术要点 在现代软件开发中,数据传输是一项基本且关键的任务,特别是在处理大文件时,断点续传功能显得尤为重要。断点续传允许在网络连接中断后恢复传输,避免了重新...
### Java贪吃蛇游戏源码解析与多线程应用 #### 概述 根据提供的代码片段及描述,本文将深入探讨一个使用Java编写的贪吃蛇游戏,它不仅支持基本的游戏功能,还允许用户自定义游戏界面的颜色,并通过多线程技术实现...