FutureTask

通过实现runnableFuture接口实现两个接口:

future和runnable

future是一个接受任务的接口

里面有方法 cancel,取消任务

get()无参数的方法等待任务执行结束,获取任务的返回结果(泛型)

带参数的方法,等待一定时间,如果还没返回结果,抛出异常

iscancelled 和 isDone方法检测,是否取消任务和是否完成(包括正常终止,异常,取消)

内部有一个volatile 的state字段,用来作为全局变量。

从0到6的7个状态

一个接受callable类型的引用

一个Object类型的outcome(返回值)

一个线程引用

一个node类引用

report()根据传入状态返回结果

两个重载的构造方法:传入callable参数的很好理解,里面的call方法就是要执行的任务,call方法的返回值,到时候赋值给outcome,等待返回

传入runnable和result的,是用一个executor的内部类,适配器模式,call方法中又调用callble接口实现类的run方法

先看run方法,先判断状态是否是new 0 ,以及将当前线程引用是不是null,cas置换成当前线程是否成功,不成功直接返回,执行callable实现类的call方法,如果成功执行,不抛出异常的情况下,call的结果值赋值给outcome

第二重要的是awaitDone方法,这个方法是等待线程run方法结束,之后再获取结果,在get()方法中扮演重要地位,

awaitDone方法是个for循环,获取state,一般在run方法之后调取get,run方法最后阶段会调用set方法,然后把state设置为2,所以进来之后,

如果run方法执行完了,那么进入第一个if,q.thread为null,把2返回

正常的判断是,在futureTask构造的时候,state是new 0的,进来之后,q==null所以先赋值new waitnode,赋值的时候,会把当前thread对象传递给node里的thread引用,

第二轮,进入!queued,将waiters的waitnode对象替换成q,并且把q的next指针指向waitnode对象,当然也可以为null,开始的时候。

第三轮,因为已经把当前对象加入等待队列里了,所以可以将当前线程park掉,停掉,这个无限期停止的恢复,是在set方法中,有一个finishCompletion()方法, 恢复所有挂起线程。

时间: 2024-09-30 09:46:07

FutureTask的相关文章

深入学习 FutureTask

原文出处: 天凉好个秋 第一部分:What 在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果.本文会简要的介绍使用方法,然后会从源代码角度分析下具体的实现原理.本文以Java 1.7的代码进行分析. 第二部分:How Callable接口 对于需要执行的任务需要实现Callabl

Java并发编程:Callable、Future和FutureTask(转)

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

Callable、Future和FutureTask浅析

我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接口吗?,是的,从JAVA SE 5.0开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果,今天我们就来聊聊线程创建的第三种方式,那就是实现Callable接口. 1.Callabl

Callable, Runnable, Future, FutureTask

Java并发编程之Callable, Runnable, Future, FutureTask Java中存在Callable, Runnable, Future, FutureTask这几个与线程相关的类或接口, 下面来了解一下它们的作用和区别. 一.Callable和Runnable Callable和Runnable类似, 实现Callable和Runnable接口的类都是可以被其他线程运行的任务, Callable和Runnable主要有以下几点区别: (1). Callable中声明的

FutureTask源码解读

import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class TestFuture { public static void

Callable、Future和FutureTask

Runnable是执行工作的独立任务,但是它不返回任何值,如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦.自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 一.Runnable java.lang.Runnable是一个接口,在它里面只声明了一个run()方法: 由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果. 二.Callable Callable位

Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask

CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier.CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到所有线程都达到了这个屏障时,再一起继续执行后面的动作.看一下CyclicBarrier的使用实例: public static class CyclicBarrierThread extends Thread { private CyclicBarrier cb; private int sleep

[转载] Java并发编程:Callable、Future和FutureTask

转载自http://www.cnblogs.com/dolphin0520/p/3949310.html 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果.

FutureTask浅析

Future多用于耗时线程的计算,主线程可以在完成自己的任务后,再去查询该Future是否执行完毕并获取结果.他有一个回调函数protected void done(),当任务结束时,该回调函数会被触发.因此,只需重载该函数,即可实现在线程刚结束时就做一些事情. FutureTask则是一个RunnableFuture<V>,即实现了Runnbale又实现了Futrue<V>这两个接口,另外它还可以包装Runnable和Callable<V>,它可以通过Thread包装

java多线程之Callable、Future和FutureTask

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