FutureTask——另一种闭锁的实现】的更多相关文章

关于多线程,我们接触对多的,最基础,入门的可能就是实现Runnable接口继承Thead类,因为Java单继承的原因,通常建议是实现Runnable接口.但这种"简单"的线程会带来一个问题,写过的人都知道,不管是实现Runnable还是继承Thread类,他们都是实现public void run()方法,而这个方法可以看到是没有返回值的.但我们想执行一个线程得到它的返回值应该怎么做呢?此时FutureTask就要出场了. 首先我们还是需要定义一个线程,不同的是这个线程需要实现Call…
项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable实现. FutureTask 也可以做闭锁,它是 Future 和 callable 的结合体.所以我们有必要来了解 FutureTask 这个类. FutureTask 的继承关系类图 先看 FutureTask 类的继承: public class FutureTask<V> implements RunnableFutu…
此小节介绍几个与锁有关的有用工具. 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态.也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成. CountDownLatch是JDK 5+里面闭锁的一个实现,允许一…
此小节介绍几个与锁有关的有用工具. 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态.也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成. CountDownLatch是JDK 5+里面闭锁的一个实现,允许一…
我画了一张关于FutureTask的类图,主要包括FutureTask的几个重要的函数和字段,还有它和父类的关系. 根据上面图我们可以清晰的看出FutureTask的继承关系.FutureTask继承一个最重要的类是Future,有几个比较重要的方法get,cancel,isCancelled等.FutureTask是为了弥补Thread的不足而设计的,它可以让程序员准确地知道线程什么时候执行完成并获得到线程执行完成后返回的结果(如果有需要).FutureTask是一种可以取消的异步的计算任务.…
CountDownLatch实际上是一种闭锁实现.闭锁:是一种同步工具类,可以延迟线程的进度知道其到达终止状态--<Java并发编程实战>.这个怎么解释呢?简单来说,就是有1个线程需要等待其余10个线程都执行完毕后再执行,这个时候就可以使用闭锁,也即CountDownLatch(当然闭锁的实现并不止这一种).关于对闭锁的详细解释请参考<Java并发编程实战>P79. CountDownLatch中有一个计数器,该计数器通过构造方法传递,表示需要完成的工作.有两个主要的方法:coun…
一.概述 FutureTask包装器是一种非常便利的机制,同时实现了Future和Runnable接口. 类图如下: FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待.运行和完成.完成包括所有计算以任意的方式结束,包括正常结束.取消和异常. Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常. FutureTask有下面几个重…
1.Callable和Runnable 看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; } 看Runnab…
原文:慕课网实战·高并发探索(十三):并发容器J.U.C -- 组件FutureTask.ForkJoin.BlockingQueue FutureTask FutureTask是J.U.C中的类,是一个可删除的异步计算类.这个类提供了Future接口的的基本实现,使用相关方法启动和取消计算,查询计算是否完成,并检索计算结果.只有在计算完成时才能使用get方法检索结果;如果计算尚未完成,get方法将会阻塞.一旦计算完成,计算就不能重新启动或取消(除非使用runAndReset方法调用计算). R…
1. 前言 当我们在 Java 中使用异步编程的时候,大部分时候,我们都会使用 Future,并且使用线程池的 submit 方法提交一个 Callable 对象.然后调用 Future 的 get 方法等待返回值.而 FutureTask 是 Future 的一个实现,也是我们今天的主角. 我们就从源码层面分析 FutureTask. 2. FutureTask 初体验 我们一般接触的都是 Future ,而不是 FutureTask , Future 是一个接口, FutureTask 是一…
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561154.html  一:Future 在使用实现Callable创建线程时,call()方法是有返回值的.那么,我们在编程时用什么来代表这个 线程执行后才能返回的未来结果 呢?那就是 Future类型. 顾名思义,Future——未来值,我们用这个未来值来代替编程中需要用到线程结果的地方,然后在实际运行时,通过 future.get() 方法来获取线程的真正运行结果. Future接口有一个泛型参数,其…
通过前面几篇的学习,我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接口吗?,是的,从Java SE 5.0开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果,今天我们就来聊聊线程创建的第三种方式,那就是实现Callable接口.…
 FutureTask类是Future 的一个实现,并实现了Runnable,所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行.如果在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态.   Executor框架利用FutureTask来完成异步任务,并可以用来进行任何潜在的耗时的计算.一般FutureTask多用于耗时的计算,主线程可以在…
Future API: public interface Future<V> { /** * Attempts to cancel execution of this task. This attempt will * fail if the task has already completed, has already been cancelled, * or could not be cancelled for some other reason. If successful, * and…
一.Futrue模式有什么用?------>正所谓技术来源与生活,这里举个栗子.在家里,我们都有煮菜的经验.(如果没有的话,你们还怎样来泡女朋友呢?你懂得).现在女票要你煮四菜一汤,这汤是鸡汤,有常识的人鸡汤要煲好久滴.如果你先炒四个菜,最后再煲汤,估计都已经一天的时间了.好了.如果我们先煲汤,在煲汤的时候,同时去炒四个菜.这个模式就是Future模式啦.是不是很简单.------>实现Future模式的,我们直接用JDK提供给我们的FutureTask类就可以了.----->直接上代码…
1:测试ThreadLocal类,  为每个线程域保存局部变量.例如下面的例子. ThreadLocal为每个线程保存了一个Test对象,  那么当执行线程时,每个线程中的test具有唯一性.某一个线程执行时,查询当前线程是否在ThreadLocalMap是否具有Test缓存对像,判断出该线程具有ThreadLocal保存的Test对象时,就不再创建Test对象,使用ThreadLocal为本线程保存的Test对象.如果没有就创建一个. package chapter03; import jav…
java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)java&android线程池-Executor框架之ThreadPoolExcutor&ScheduledThreadPoolExecutor浅析(多线程编程之三)Java多线程:Callable.Future和FutureTask浅析(多…
一.概述 FutureTask包装器是一种非常便利的机制,同时实现了Future和Runnable接口. 类图如下: FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待.运行和完成.完成包括所有计算以任意的方式结束,包括正常结束.取消和异常. Future有个get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常. FutureTask有下面几个重…
FutureTask FutureTask是J.U.C中的类,是一个可删除的异步计算类.这个类提供了Future接口的的基本实现,使用相关方法启动和取消计算,查询计算是否完成,并检索计算结果.只有在计算完成时才能使用get方法检索结果;如果计算尚未完成,get方法将会阻塞.一旦计算完成,计算就不能重新启动或取消(除非使用runAndReset方法调用计算). Runnable与Callable对比 通常实现一个线程我们会使用继承Thread的方式或者实现Runnable接口,这两种方式有一个共同…
回顾: 接上篇博客 java线程--三种创建线程的方式,这篇博客主要介绍第三种方式Callable和Future.比较继承Thread类和实现Runnable接口,接口更加灵活,使用更广泛.但这两种方式都没有返回值,要想返回相应的数据,就要使用Callable和Future方式. 基础: 1.Callable 还是从定义开始,Callable接口有返回值,并且可以抛出异常. /**(有返回值的任务,可能抛出异常) * A task that returns a result and may th…
回顾: 接上篇博客 java线程--三种创建线程的方式,这篇博客主要介绍第三种方式Callable和Future.比较继承Thread类和实现Runnable接口,接口更加灵活,使用更广泛.但这两种方式都没有返回值,要想返回相应的数据,就要使用Callable和Future方式. 基础: 1.Callable 还是从定义开始,Callable接口有返回值,并且可以抛出异常. /**(有返回值的任务,可能抛出异常) * A task that returns a result and may th…
FutureTask是一种可以取消的异步的计算任务.它的计算是通过Callable实现的,多用于耗时的计算. 一.FutureTask的三种状态 二.get()和cancel()执行示意 三.使用 一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果. 3.1 FutureTask + Thread package concurrent; import java.util.Random; import java.util.concurrent.Callable;…
FutureTask源码深度剖析 前言 在前面的文章自己动手写FutureTask当中我们已经仔细分析了FutureTask给我们提供的功能,并且深入分析了我们该如何实现它的功能,并且给出了使用ReentrantLock和条件变量实现FutureTask的具体代码.而在本篇文章当中我们将仔细介绍JDK内部是如何实现FutureTask的.(如果对FutureTask的内部大致过程还不是很了解的话,可以先阅读自己动手写FutureTask). 工具准备 在JDK的FutureTask当中会使用到一…
Callable这种任务可以返回结果,返回的结果可以由Future去拿 >Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的. >CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象. 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是那块先成熟了,则先去收割哪块麦子. Future<String> future = threadPool.submit…
闭锁 一种可以延迟线程的进度直到其到达终止状态.可以用来确保某些活动直到其他活动都完成后才继续执行 例如: 确保某个计算在其需要的所有资源都被初始化了之后才继续执行. 确保某个服务在其他依赖的服务都启动了之后才开始执行 等待某个操作的所有参与者(如LOL) 都就绪了之后再继续执行. 锁的实现 1.CountDownLatch CountDownLatch 是一种灵活的闭锁实现. 可以在以上的各种类型情况下使用.它可以使一个或多个线程等待一组事件的发生. 闭锁状态包括一个计数器,该计数器被初始化为…
本章会介绍一些最有用的并发构建模块,有丶东西(最后一小节,纯干货). 5.1 同步容器类 同步容器类包括 Vector 和 Hashtable ,这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能访问容器的状态. 5.1.1 同步容器类的问题 同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁来保护符合操作.容器上常见的复合操作包括:迭代(反复访问元素,直到遍历完容器中所有元素).跳转(根据指定顺序找到当前元素的下一个元素)以及条件…
5. CountDownLatch 闭锁 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能. CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行: 确保某个计算在其需要的所有资源都被初始化之后才继续执行; 确保某个服务在其依赖的所有其他服务都已经启动之后才启动; 等待直到某个操…
在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异步 IO 和轻量级任务框架.提供可调的.灵活的线程池.还提供了设计用于多线程上下文中的 Collection 实现等. 一.volatile关键字.内存可见性 内存可见性 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后…
Callable接口  Java 5.0 在 java.util.concurrent 提供了一个新的创建执行 线程的方式:Callable 接口  Callable 接口类似于 Runnable,两者都是为那些其实例可 能被另一个线程执行的类设计的.但是 Runnable 不会返 回结果,并且无法抛出经过检查的异常.  Callable 需要依赖FutureTask ,FutureTask 也可以用作闭锁 创建执行线程的方法有四种: 1.继承Thread类或者创建线程类 2.通过实现Ru…
先附上学习的博客地址:http://blog.csdn.net/cx8122389/article/details/70049425, 具体见该博客 Java JUC 简介 在Java 5.0 提供了java.util.concurrent(简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异步IO 和轻量级任务框架.提供可调的.灵活的线程池.还提供了设计用于多线程上下文中的Collection 实现等 原子,集合,线程,同步,线程池,…