小工具      在线工具  汉语词典  css  js  c++  java

ThreadPoolExecutor execute和submit

Java 额外说明

收录于:42天前

多线程还有一个有趣的地方就是,向线程池提交线程时其实有两种方法:一种是execute,一种是submit

1.执行提交方法

execute提交方法只能提交一个Runnable对象,并且该方法的返回值为void,即提交后如果线程运行,则会与主线程断开连接。当然,你可以设置一些变量来获取线程的运行结果。并且当线程执行过程中抛出异常时,通常主线程无法获取异常信息。只有通过ThreadFactory主动设置线程的异常处理类,才能感知到提交的线程中的异常信息。

2. 如何提交

提交方式有以下三种:

1. <T> Future<T> 提交(Callable<T> 任务);

这种提交方式是提交一个实现Callable接口的对象。 Callable接口的定义如下

public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

可以看到Callable接口和Runnable接口的定义非常相似,只不过Runnable接口有一个没有返回值的run方法,而Callable接口有一个有返回值的call方法。

该提交方法将返回一个 Future 对象。这个Future对象代表了这个线程的执行结果。 (前段时间去阿里巴巴面试,被问到Future是什么,现在想来,这个问题我本来是解释过的,并不是面试官不太满意。)

当主线程调用Future的get方法时,会获取线程返回的结果数据。

如果线程执行过程中发生异常,get将获取异常信息。

2. Future<?> 提交(可运行任务);

还可以提交一个Runable接口的对象,这样在调用get方法时,如果线程执行成功则直接返回null,如果线程执行异常则返回异常信息。

3. <T> Future<T> 提交(可运行任务,T 结果);

这个界面比较有趣。除了任务之外,还有一个结果对象。

当线程正常结束的时候调用Future的get方法会返回result对象,当线程抛出异常的时候会获取到对应的异常的信息。
 


// 1. 初始化线程池方法一
private static final ExecutorService es = new ThreadPoolExecutor(8, 10, 100, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(100));


    public static void main(String[] args) {

// 2. 初始化线程池方法二
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        System.out.println("------------------任务开始执行---------------------");

        Future<String> future = es.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(5000);
                System.out.println("submit方法执行任务完成" + "   thread name: " + Thread.currentThread().getName());
                return SUCCESS;
            }
        });

        try {
            // submit()返回FutureTask对象,通过这个FutureTask对象调用get()可以返回submit()方法传入的一个泛型类参数result对象,如果是Callable直接通过call()返回。这个返回值的可以用来校验任务执行是否成功。
            String s = future.get(); 
            if (SUCCESS.equals(s)) {
                String name = Thread.currentThread().getName();
                System.out.println("经过返回值比较,submit方法执行任务成功    thread name: " + name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("-------------------main thread end---------------------");
    }

. . .

相关推荐

额外说明

JProfiler入门

JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点,这里提供有几篇文章供参考:获取、介绍,简单入门,使用JProfiler解决实际问题

额外说明

编译安装Nginx

首先关闭防火墙和selinux。 配置自己的yum源   [root@localhost ~]# vi local.repo [base] name=base baseurl=http://10.36.192.250/base enable=1 gpgc

额外说明

java基础-栈

小伙伴们,你们好呀!我是老寇! 栈是一种特殊的线性表,并且只能一端进行插入和删除操作 本文采用链表来创建栈 1.创建一个节点的类 package cn.itcast.com.istack; public class Node { public Ob

额外说明

企业微信在ios机型无法吊起打开个人信息页接口(openUserProfile)

wx.qy.openUserProfile({ type: 1,//1表示该userid是企业成员,2表示该userid是外部联系人 userid: "wmEQlEGwAAHxbWYDOK5u3Af13xlYAAAA", //可以

额外说明

Python OpenCV Hough直线检测算法的原理与实现

直线检测原理 核心要点:图像坐标空间、参数空间、极坐标参数空间 -> (极坐标)参数空间表决 给定一个点,我们一般会写成y=ax+b的形式,这是坐标空间的写法;我们也可以写成b=-xa+y的形式,这是参数空间的写法。也就是说,给定一个点,那么经过该点的直

额外说明

OpenCV实战(20)——图像投影关系

OpenCV实战(20)——图像投影关系 0. 前言 1. 相机成像原理 2. 图像对的基本矩阵 3. 完整代码 小结 系列链接 0. 前言 数码相机通过将光线通过镜头投射到图像传感器上来捕捉场景产生图像。由于通过将 3D 场景投影到 2D 平面上形成图

额外说明

springcloud 使用git作为配置中心

springcloud提供了一整微服务解决方案,在其组件体系中,有一个很重要的模块就是分布式配置中心 首先,需要明确一个配置中心提供的核心功能应该有什么 提供服务端和客户端支持 集中管理各环境的配置文件 配置文件修改之后,可以快速的生效 可以进行版本管理

额外说明

JDK、JRE、JVM:揭秘Java的关键三者关系

文章目录 JDK:Java开发工具包 JRE:Java运行环境 JVM:Java虚拟机 关系概述 案例示例:Hello World 结语 在Java世界中,你可能经常听到JDK、JRE和JVM这几个概念,它们分别代表了Java开发工具包、Java运行环境

额外说明

Python中*args和**kwargs的解释

        大家经常可以发现在一些函数里面出现*args和**kwargs的参数项,一个是位置参数,一个是关键字参数(keyword arguments),名字可以随便定义,只是大家约定俗成使用这个,便于知道参数的含义。 那加一个星号和两个星号,有什

额外说明

0.各类资料

Cesium学习系列汇总 https://mp.weixin.qq.com/s/DA9Z4MN5r0i0Js2wdGTNGw 【Cesium 基础】ImageryProvider 服务 https://blog.csdn.net/seelingzheng

ads via 小工具