Java程序员必须掌握的线程知识-Callable和Future

创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。

一、Runnable接口

先看一下java.lang.Runnable吧,它是一个接口,在它里面只声明了一个run()方法:

public interface Runnable {
    public abstract void run();
}

由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。

二、Callable接口

Callable接口位于java.util.concurrent包下,在它里面也只声明了一个方法,只不过这个方法叫做call()。

public interface Callable<V> {
    V call() throws Exception;
}

可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。Callable接口可以看作是Runnable接口的补充,call方法带有返回值,并且可以抛出异常。

三、FutureTask类

如何获取Callable的返回结果呢?一般是通过FutureTask这个中间媒介来实现的。整体的流程是这样的:
把Callable实例当作参数,生成一个FutureTask的对象,然后把这个对象当作一个Runnable,作为参数另起线程。

3.1 FutureTask的结构

3.2 FutureTask的启动

由于FutureTask实现了Runnable,因此它既可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行。下面以Thread包装线程方式启动来说明一下。

/**
 * Created by gan on 2019/5/19 10:01.
 */
public class FutureTaskAndCallableDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("计算线程正在努力的计算结果....");
                TimeUnit.SECONDS.sleep(6);
                return 100;
            }
        };

        FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);
        Thread thread = new Thread(futureTask);
        thread.start();

        System.out.println("main线程干点别的任务...");

        Integer result = futureTask.get();
        System.out.println("从计算线程拿到的结果为: " + result);

    }
}

四、Future接口

FutureTask继承体系中的核心接口是Future。Future的核心思想是:一个方法,计算过程可能非常耗时,等待方法返回,显然不明智。可以在调用方法的时候,立马返回一个Future,可以通过Future这个数据结构去控制方法f的计算过程。
这里的控制包括:
get方法:获取计算结果(如果还没计算完,也是必须等待的)
cancel方法:还没计算完,可以取消计算过程
isDone方法:判断是否计算完
isCancelled方法:判断计算是否被取消

参考链接: http://www.threadworld.cn/archives/39.html

           https://www.cnblogs.com/fengsehng/p/6048609.html

原文地址:https://www.cnblogs.com/ganbo/p/10888286.html

时间: 2024-10-07 02:44:19

Java程序员必须掌握的线程知识-Callable和Future的相关文章

JAVA程序员需要学习哪些基础知识?

极客营认为想要成为一个合格的java程序员,必须需要牢固的基础,这样在未来接触新的知识的时候,才能快速吸收,极客营认为基础不牢固的程序员,随时都会被新的知识和技术所淘汰,下盘不稳风一吹就倒,那么作为一个合格的java程序员应该具备哪些知识呢?今天极客营就来和大家分享java高手之路上的必备基础知识: 一.面向对象的知识:JAVA是一个面向对象的开发语言,因此熟悉面向对象对学习JAVA很有必要,您要了解:什么是对象,什么是类;什么是封装,什么是多态,什么是继承;什么是抽象类,什么是接口.了解了概念

[转载]Java程序员掌握的10大项知识体系--精通太难说出口

1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:appletviewer. HtmlConverter.jar. java.javac.javadoc.javap.javaw.native2ascii.serialver,如果这些命令你没有全部使用过,那么你对java实际上还很不了解. 3.工具:必须至少熟练使用一种IDE的开发工具,例如Eclip

【高级java程序员应该知道的小知识】 volatile

本篇态度: simple & stupid volatile 用法: private volatile Service.STATE state; 优点: 比其他的锁机制(synchronized.lock)简单: 不阻塞: 对volatile修饰的变量允许并发读. 谨记: Java Memory Model ensures that all threads see a consistent value for the variable volatile提供变量修改后对其他线程的可见性. 变量被一

【高级java程序员应该知道的小知识】 WeakHashMap

本篇宗旨:simple & stupid WeakHashMap (弱引用的哈希表) Hash table based implementation of the Map interface, with weak keys. An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. More precisely, the presence of a mapp

【高级java程序员应该知道的小知识】weak reference

本篇态度: simple & stupid weak reference Weak reference objects, which do not prevent their referents from being made finalizable, finalized, and then reclaimed. Weak references are most often used to implement canonicalizing mappings. 弱引用不会阻止其引用的对象变成fin

越来越多的Java程序员转行Java大数据...

JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入IT行业,首选的第一门语言就是JAVA. 但是,在未来肯定是大数据的天下,人工智能的爆发,将会有大量企业会进入大数据领域,从而产生大量的大数据人才需求. 据最新发布的<大数据人才报告>显示,目前全国的大数据人才仅46万,未来3-5年内大数据人才的缺口将高达150万.领英报告表明,数据分析人才的供给指数最低,仅为0.05,属于高度稀缺.数据分析人才跳槽速度也最快,平均跳槽速度为19.8个月

Java程序员那么多,如何才能脱颖而出?

JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入IT行业,首选的第一门语言就是JAVA.但是,在未来10年肯定是大数据的天下,人工智能的爆发,将会有大量企业会进入大数据领域,而从JAVA程序员转JAVA大数据就会有天然的优势,因为目前大数据的架构基本都是用JAVA语言完成,未来10年,JAVA大数据的需求量会越来越大. 现在学习JAVA的小伙伴,如果想以后不被淘汰,将来势必会进军大数据行列,根据目前的行业动态,JAVA程序员由于发展的局

开发四年Java程序员斩获阿里P6岗,月薪40K+,靠的就是这两份文档!

目前一线城市的薪资水平在13到40k之间,但是找工作的时候并不仅仅有工作经验就行了,还需要一定的专业知识.如果你野心更大,想要进阿里美团头条等等这些大厂的话,那就需要更多的专业知识.那么,一个四年工作经验的Java程序员应该要具备哪些知识呢? 我整理了之后发现,程序员需要懂好多的知识. 为此,我将这些知识点整理搜集成了一个核心笔记PDF版,以及配套的面试题大纲,加起来差不多八百页!因为知识点太多,我这里只截目录出来,如需完整核心笔记及面试大纲的可以进我的学习交流群:909666042 免费获取!

Java 程序员 面试前必备知识

前言 正文 自我介绍 数据结构和算法 Java篇 Java EE知识点储备 计算机网络 操作系统 数据库相关 XML 常识性知识 总结 前言 准备了接近两个月的面试笔试,现在终于是可以休息下了.真真是应了那句老话"台上一分钟, 台下十年功.". 人嘛,越努力,才会越幸运.机会总是留给有准备的人的. 下面分享一下我的Java实习生准备所看过的材料,(虽然至今还有些依然看不懂地方.) 希望对这方面的同学有点帮助. 正文 自我介绍 先针对自己的情况写段自我介绍,真实一些就好了,这方面我倒是没