Java 中 Future 的 isCancelled 方法是否有必要 [问题点数:20分]

Bbs1
本版专家分:0
结帖率 0%
Bbs4
本版专家分:1110
Bbs1
本版专家分:0
Java并发编程:Callable和Future使用
在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。 不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果。
Java Future接口、Future模式理解
Future接口介绍: 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在<em>java</em>.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。 Future模式可以这样来描述:我有一个任务,提交给了
线程池之Future
线程池任务执行结果 这一节来探讨下线程池中任务执行的结果以及如何阻塞线程、取消任务等等。 1 package info.imxylz.study.concurrency.<em>future</em>; 2  3 public class SleepForResultDemo implements Runnable { 4  5     static boolean result = f
Future类源码解析翻译
/**  * A Future represents the result of an asynchronous  * computation.  Methods are provided to check if the computation is  * complete, to wait for its completion, and to retrieve the result o
Java并发编程之线程池、Callable和Future使用
<em>java</em>并发编程中线程池、Callable使用说明
Guava ListenableFuture实现异步非阻塞调用
为了保证系统响应迅速,需要寻找一种<em>方法</em>能够使调取接口能够异步执行,而Java正好提供了类似的<em>方法</em>,在<em>java</em>.util.concurrent中包含了Future相关的类,运用其中的一些类可以进行异步计算,以减少主线程的等待时间。比如启动一个main<em>方法</em>,main中又包含了若干个其它任务,在不使用Java <em>future</em>的情况下,main<em>方法</em>中的任务会同步阻塞执行,一个执行完成后,才能去执行另一个;如果
Android并发编程之白话文详解Future,FutureTask和Callable
说到并发编程,就一定是多个线程并发执行任务。那么并发编程的基础是什么呢?没错那就是Thread了。一个Thread可以执行一个Runnable类型的对象。那么Runnable是什么呢?其实Runnable是一个接口,他只定义了一个<em>方法</em>run(),这个run()<em>方法</em>里就是我们要执行的任务,并且是要被Thread调用的。因此,一个Runnable就可以理解为一个要被执行的任务,而Thread就是一个执
Java进阶之FutureTask的用法及解析
1 FutureTask概念FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本<em>方法</em>,提空 start cancel 操作,可以查询计算<em>是否</em>已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,get<em>方法</em>会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。一个FutureTask 可以用来包装一个 Callable 或是一个ru
Java 判断线程池 执行完毕
工作中,遇到很多情况需要使用线程,或者线程池。但往往我们需要dengda
Java异步Future详解
简介 Future主要用于有返回值的异步任务。最核心的类是FutureTask,它是Future接口唯一的实现类。 FutureTask 可以看出FutureTask类实现了Runnable和Future接口。 内部属性有 private volatile int state; private Callable&amp;lt;V&amp;gt; callable; /...
Future异常
由于 Future 的结果是与程序的其它部分并发生成的,因此异常需要作特殊的处理。 不管是 Actor 或是派发器正在完成此 Future, 如果抛出了 Exception ,Future 将持有这个异常而不是一个有效的值. 如果 Future 持有 Exception, 调用 Await.result 将导致此异常被再次抛出从而得到正确的处理. 通过返回一个其它的结果来处理 Excep
java中的 Future详解(以及ExecutorService中的各种方法
关于这一块一前一直是一个盲点,看了看源码总结一下把。这一块内容和线程池也是息息相关的线程池的顶级接口是Executor接口,里面只有一个未实现<em>方法</em>是void execute(Runnable command);下来是ExecutorService接口,继承自Executor接口,里面多 了很多<em>方法</em>,比较重要的几个<em>方法</em>是 &amp;lt;T&amp;gt; List&amp;lt;Future&amp;lt;T&amp;gt;&amp;gt;...
Java实现限定方法执行时间 Future类执行超时处理
最近有个需求, 当调用外部接口长时间没有返回的话, 就执行下一步。 public static void main(String[] args) throws InterruptedException,ExecutionException { final ExecutorService exec = Executors.newFixedThreadPool(1);
Java并发(四):Callable和Future、锁对象Lock-完美解决同步方式
Callable和FutureCallable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子:public class CallableAndFuture {
FutureTask 深度解析
FutureTask 深度解析
Java并发编程:Callable、Future和FutureTask 获取返回值
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。   这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。   如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。   而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务
漫谈并发编程:Future模型(Java、Clojure、Scala多语言角度分析)
0x00 前言 其实Future模型离我们并不远,如果你接触过Spark、Hadoop这些优秀的开源项目,那么在运行程序的时候关注一下他们的输出日志,一不小心你就会发现Future的身影。 在并发编程领域有很多优秀的设计模式,比如常见的Producer-Consumer模式、Pipeline模式和Future模式,这些模式都有其适用的场景,并且能够高效地解决并发问题。 这篇文章会着重分享和Fut
CompletionService解决Future的get方法阻塞缺点
使用CompletionService解决Future的get<em>方法</em>阻塞问题 解决<em>方法</em>: CompletionService 的take()<em>方法</em>获取最先执行完的线程的Future对象。 详情:http://www.ya​yihouse.com/yayishuwu/chapter/1546...
(五) Java多线程详解之Callable和Future阻塞线程同步返回结果
Callable要采用ExecutorSevice的submit<em>方法</em>提交,返回Future对象,通过Future的get()<em>方法</em>,同步拿到线程的返回结果,实例代码如下:public class ThreadExample12 { public static void main(String[] args) { ExecutorService threadPool = Exec
Future 模式详解(并发使用)
原文地址:http://zha-zi.iteye.com/blog/1408189 我觉得很多讲Future模式的文章并没有深刻理解Future模式,其实Future模式只是生产者-消费者模型的扩展。经典“生产者-消费者”模型中消息的生产者不关心消费者何时处理完该条消息,也不关心处理结果。Future模式则可以让消息的生产者等待直到消息处理结束,如果需要的话还可以取得处理结果  
关于定时任务ScheduledFuture get方法无法获取thread 的情况
thread = (ScheduledFuture&amp;lt;BaseThread&amp;gt;) <em>future</em>.get(10, TimeUnit.SECONDS); 因业务需要,需要做定时任务。 在打印日志的时候试图调用其返回的<em>future</em>的get<em>方法</em>获取对应的执行线程。然后总是卡在那一行代码。经过调试,该<em>方法</em>应该只能在任务运行时runtime阶段才能访问到对应的执行线程,非执行阶段无法获取。以此做...
多线程、线程池、Future的一些疑惑
今天需要用到多线程的时候,用到了线程池,以及Future class,测试代码如下:ExecutorService pool = Executors.newFixedThreadPool(2); List> list = new ArrayList>(); for(int i = 0; i < 10; i++) { MyFuture
Java多线程 - Callable 和 Future实现有返回值的线程
原文地址:http://chenxiaoqiong.com/articles/thread2/ 假设有一个很耗时的返回值需要计算,并且这个返回值不是立刻需要的话,那么就可以使用这个组合,用另一个线程去计算返回值,而当前线程在使用这个返回值之前可以做其它的操作,等到需要这个返回值时,再通过Future得到。 创建 Callable 接口的实现类,并实现 call() <em>方法</em>,该 call() <em>方法</em>
akka学习教程(八) Actor中的Future-询问模式
和<em>java</em>线程中的<em>future</em>挺像的,可以将一个actor的返回结果重定向到另一个actor中进行处理,主actor或者进程无需等待actor的返回结果。
java多线程Future、FutureTask使用示例,返回异步的结果
1、Future、FutureTask介绍Future是一个接口,该接口用来返回异步的结果。FutureTask是一个类,是Future 的一个实现。2、主要<em>方法</em><em>future</em>.get(); 或者 <em>future</em>.get(10000, TimeUnit.MILLISECONDS);获取多线程异步执行结果,但get<em>方法</em>是一个同步<em>方法</em>,如果未拿到结果或者未超时,主线程则一直等待。<em>future</em>.cancel(
java线程中Callble和Future的使用
Callable是<em>java</em>.util.concurrent包中一个接口,Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。此接口中就声明了一个<em>方法</em>call(),这个<em>方法</em>计算结果,如果无法计算结果,则抛出一个异常。Executors 类包含一些从其他普通形式转换成 Callable
java ThreadPool判断是否所有任务都完成的方法
@Test public void test() { ExecutorService threadPool = Executors.newCachedThreadPool(); Future <em>future</em>1 = threadPool.submit(new Callable() { @Override public String call() throws Exception
java 多线程(一)---创建线程的三种方式Thread,Runnable,Callable与Future
1 前言在<em>java</em>中我们经常会遇到多线程问题,包括线程的互斥,同步,线程通信,线程池等一些问题,也是面试中经常问道的。这里做一个笔记。本篇主要介绍创建线程的三种方式,后续会陆续介绍同步,线程通信等问题2 继承Thread类继承Thread类并复写run()<em>方法</em>,是一种很简单的方式,代码如下:package thread;/** * Created by qiyei2015 on 2017/2/6.
使用多线程优化批量导入的回显功能
最近参与开发的项目有批量导入数据的功能,导入回显的过程中需要做一些校验,以确保导入数据的正确性。如果导入的数据特别多,校验规则也特别多,那么一条一条校验的时间就会很长,影响系统使用。这个时候可以使用多线程来并行校验。这里记录一下,以防忘掉。一般要导入的每一条数据的校验都是相互独立的,那么让几条数据并行校验不会影响其他数据。基于这个思想,使用多线程优化导入。笔者所在项目使用了SSM框架,代码实现是在s
Promise模式简介(Future) -Java实现异步
Promise模式简介 Promise模式是一种异步编程模式 。它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作。等到我们需要该任务的执行结果时,再调用凭据对象的相关<em>方法</em>来获取。这样就避免了不<em>必要</em>的等待,增加了系统的并发性。这好比我们去小吃店,同时点了鸭血粉丝汤和生煎包。当我们点餐付完款后,我们拿到手的其实只是一张可借
JAVA 并发编程-返回执行结果(Callable和Future)(九)
启动一个线程不论使用Thread或者Runnable的时候,都是没有返回结果的。也就是说Thread和Runnable的run()<em>方法</em>必须没有返回值。   public void run(){} 解决方案: Callable和Future,一个产生结果,一个拿到结果。 简单的来一个实例demo帮助我们理解:public class CallableAndFuture { /** * @pa
java future并发获得返回值示例
package com.jikuan.zjk.<em>future</em>; import <em>java</em>.util.ArrayList; import <em>java</em>.util.List; import <em>java</em>.util.Random; import <em>java</em>.util.concurrent.*; /** * 试验 Java 的 Future 用法 * jikuan.zjk */ public class F
利用Future异步获取多线程的返回结果
Future接口是Java标准API的一部分,在<em>java</em>.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。 有了Future就可以进行三段式的编程了,1.启动多线程任务2.处理其他事3.收集多线程任务结果。从而实现了非阻塞的任务调用。在途中遇到一个问题,那就是虽然能异步获取结果,但是Future的结果需要通过isdone来判断<em>是否</em>
java Future用法和意义
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。 所以run的返回值是void类型。 如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。 但后者需要前者的结果,就需要用callable接口了。 callable用法和runnable一样,只不过调用的是call<em>方法</em>,该<em>方法</em>有一个泛型返回值类型,你可以
Future方式中断线程实现
<em>java</em> <em>future</em>方式实现线程中断
Callable和Future 的用法详解
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。 Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务
Java多线程实战:FutureTask与CountDownLatch的完美结合
前提概要 在知乎上看到一道Java多线程的笔试题,心想我多线程只会Thread和Runable,在写WebFluxTest用过一次CountDownLatch,除此之外还没怎么去看cocurrent包下的类,所以就想试试。 题目 知乎传送门:某大型电商Java面试题:一主多从多线程协作 客户请求下单服务(OrderService),服务端会验证用户的身份(RemotePassportS...
Java Callable、Future的两种使用方式
Java Callable、Future的两种使用方式 Callable+Future public class Test { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); Task task = new
Java多线程Future的使用
先直接上代码如下: 一、需要实现Callable接口(可以使用泛型) package com.innotek.spms.service.finance; import com.innotek.common.util.SpringContextUtil; import com.innotek.spms.entity.busi.Collector; import com.innotek.spms
Scala future 回调函数方法
结果输出: [info] Running org.learningconcurrency.ch4.FuturesCallbacks run-main-0: callbacks installed, continuing with other work [success] Total time: 4 s, completed 2016-3-20 9:21:34 > ForkJoinPool-1-w
Java中使用Future获取线程异步执行结果的使用
Java中使用Future获取线程异步执行结果的使用,超时放弃的代码策略
改进版的线程池(仿java的ScheduledFuture)
需求上一篇写了一个线程池http://blog.csdn.net/ylbs110/article/details/51172428 经过仔细查询<em>java</em>API才发现我前面一个方案并不符合要求:<em>java</em>中的newSingleThreadScheduledExecutor是个单线程池,也就是说一直只有一个线程在跑,新添加的任务会存储起来,线程每次跑完一个任务再获取一个新任务继续跑,没有任务则等待任务。
Java中的异步执行Future小结
最近碰到的异步处理的操作比较多,异步就是不等想要的结果返回执行接下来的其他操作,等异步结果返回后直接调用已经注册好的处理<em>方法</em>完成后续操作。异步的思想是非常棒的,相比轮询的方式而言,异步的实现方式无疑是高效并且优雅的。本文介绍了包括Future,AIO和有点类似于单机版的Map-Reduce的fork/join框架。 Guava ListenableFuture 使用JDK提供的线程池E...
Java多线程/并发20、Future实现类:FutureTask
FutureTask是<em>future</em>的实现类,它同时实现了两个接口:Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。因此我们可以: - 调用FutureTask对象的run()<em>方法</em>执行 - 调用FutureTask对象的get()<em>方法</em>取结果 - 也可以将FutureTask对象作为callable的实现用线程池
使用Future的cancel()方法来取消已经提交给执行者的任务
public class Task implements Callable{ @Override public String call() throws Exception { while (true) { System.out.println("Task: Test\n"); Thread.sleep(1
scala:Future的理解及使用
package com.yy.enhance import <em>java</em>.net.InetAddress import <em>java</em>.net.UnknownHostException import actors._, Actor._ import scala.actors.Actor /** * scala Actor构建在<em>java</em>的线程基础之上的, * 为了避免频繁的线程创建、销毁和切换等,...
Java线程池及Future、Callable获得线程返回结果【Java线程池系列2】
 Java线程池及Future、Callable获得线程返回结果【Java线程池系列2】 Java多线程编程中,经常使用的Thread的Runnable()虽然被经常使用,但其有一个弊端,就是因为无法直接获取该线程的返回值,因为Runnable内的run<em>方法</em>,被定义为void类型,如果开发者需要在线程中处理耗时操作并获得结果,那么必须自己实现一套结果获取的途径,这其实增加了开发者的代码工作
Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)
通过前面几篇的学习,我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?还记上一篇Executor框架结构中提到的Callable接口和Future接口吗?,是的,从JAVA SE 5.0开始引入了Callable和Future,通过它们构建的线程,在
Java并发编程 | 第四篇:Future模式
一、什么是Future模型 常见的多线程设计模式有:单例模式、不变模式、生产者-消费者模式、Future模式;而这里介绍Future模式,它的核心思想就是异步调用。当我们需要调用一个函数,但是这个函数执行很慢,如果我们不需要马上知道结果,我们可以立即返回,让它在后台慢慢处理这个请求,对于调用者来说,可以先处理一些其他任务,这个就充分利用等待时间,在真正需要数据场合再去尝试获取需要的数据。 ...
Spring Boot使用Future以及定义超时
一 点睛 1 什么是Future类型? Future是对于具体的Runnable或者Callable任务的执行结果进行取消、查询<em>是否</em>完成、获取结果的接口。<em>必要</em>时可以通过get<em>方法</em>获取执行结果,该<em>方法</em>会阻塞直到任务返回结果。 它的接口定义如下: public interface Future&amp;lt;V&amp;gt; { boolean cancel(boolean mayInterrup...
Java并发之深入Future原理源码分析
JDK内置的Future主要使用到了Callable接口和FutureTask类。Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务。Callable接口可以看作是Runnable接口的补充,Callbale含有泛型,相比Runnable接口的run()<em>方法</em>,call()<em>方法</em>带有返回值,并且可以抛出异常。 callab...
Java并发编程:Callable、Future和FutureTask原理解析
返回结果的任务Callable与FutureExecutor框架使用Runnable作为其基本的任务表示形式。Runnable是一种有很大局限的抽象,它不能返回一个值或抛出一个受检查的异常。Runnable接口:public interface Runnable { public abstract void run(); }由于run()<em>方法</em>返回值为void类型,所以在执行完任务之后无法返回
python里使用Future对象进行回调别的函数
Future对象也可以像协程一样,当它设置完成结果时,就可以立即进行回调别的函数,例子如下:import asyncio import functools def callback(<em>future</em>, n): print('{}: <em>future</em> done: {}'.format(n, <em>future</em>.result())) async def register_callbacks(all_
多线程之Future和Callable【高性能应用场景java.util.concurrent】
如查一个数据集合,第一页至第一百页,返回总页数的总结集,然后导出。第一次需要limit 0 10000,这样,一个SQL查询出非常慢。但用100个线程,一个线程只查limit0 10 就非常快了,利用多线程的特性,返回多个集合,在合并成总集合。import <em>java</em>.util.ArrayList;import <em>java</em>.util.List;import <em>java</em>.util.concurrent.E
java 判断对象是否为空或者传入集合对象的是否为空,以及判断数组的长度
package Test;import <em>java</em>.awt.List;import <em>java</em>.lang.reflect.Array;import <em>java</em>.lang.reflect.Method;import <em>java</em>.util.ArrayList;import <em>java</em>.util.HashMap;import <em>java</em>.util.Hashtable;import j
Future结合RxJava 实现异步调用
0 概述在实际工作中,时常会遇到一个接口服务会调用很多其他的服务(10几个甚至更多,这些服务之间大多都不是相互依赖的),如果采用串行化调用,那么这个接口的服务rt(response time)就会很高,20*50ms=1000ms(假设该接口服务需要调用20个服务,平均每个服务rt为50ms)。本文主要给出Future结合Rx<em>java</em> 实现异步化调用。1 异步化调用用户信息的异步查询,需要你调用服务
求证:在处理数据时 java 手动释放变量的实际意义有多大
最近在项目中动不动就报出 <em>java</em>.lang.OutOfMemoryError: Java heap space 经查是后台定时运行了若干线程处理数据,一些是从数据库一次性拉出来了近万条记录(以后会增加的更多),在这里不考虑硬件和服务器设置,只从程序优化考虑,为了降低报出内存溢出的概率,就只能使用分页,不再一次性取出所有数据,而且线程处理完一页数据后、休眠之前,我把指向数据的变量手动释放了。 下
java Future用法和意义 - 一句话击破
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。  所以run的返回值是void类型。  如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。  但后者需要前者的结果,就需要用callable接口了。  callable用法和runnable一样,只不过调用的是call<em>方法</em>,该<em>方法</em>有一个泛型返回值类型,你可以
取得子线程的返回值(Future 搭载Callable)
其实大部分的时候子线程结束时不需要返回值,使用 new Thread(Runnable) 或者 多线程搭载Runnable的模式就行 但是如果需要返回值的时候,就很麻烦,要用外部变量控制流程,或者新增接口监听等。 当到了<em>java</em>1.5之后,就可以用Future 搭载 Callable的方式来简单解决! 贴上代码: public class CallableFutureTest {
Java怎么判断一个静态方法是否要加synchronized?
Java怎么判断一个静态<em>方法</em><em>是否</em>要加synchronized?最近在做的时候,理解静态<em>方法</em>为多个线程可以同时进入,并且像静态变量一样,会受到相互影响。查了查,发现这种理解是错误的。静态<em>方法</em>的基本含义,是将一个class中的<em>方法</em>静态出来,成为一个与instance无关,只和Class有关的<em>方法</em>,主要是为了实现不用实例化就可以调用的global<em>方法</em>。问题: 静态<em>方法</em>中定义的变量,<em>是否</em>是静态共享的?答案是
Java编程思想之并发
Java编程思想之并发
Future和Callable、FutureTask实现,带有返回值的线程请求
通过ExecutorService.submit()<em>方法</em>提交的任务,可以获取任务执行完的返回值。 在实际业务场景中,Future和Callable基本是成对出现的,Callable负责产生结果,Future负责获取结果。 1、Callable接口类似于Runnable,只是Runnable没有返回值。 2、Callable任务除了返回正常结果之外,如果发生异常,该异常也会被返
http异步请求&Future异步多线程
http异步请求使用Apache提供的HttpAsyncClient
java Callable和Future并发调用,并且返回结果小例子
线程类: /** * 类名称:CallableTest.<em>java</em> * 类描述: * 作 者:why * 时 间:2016年11月7日 */ public class CallableTest implements Callable { //接收传来的值 private String str; public CallableTest(String str){ supe
Java中的Future模式实战
简介 Future模式指的是专门分配一个可以执行取消操作的线程去处理耗时的任务,且可以返回处理结果。简单来说就是可以看做是一个带有返回值且可以取消的Thread。 如果要了解Future模式最好了解以下的类或接口: Callable:Callable是一个接口,它可以看做是带返回值的Runnable Future:Future也是一个接口,它定义了对Future模式做的线程可以执行的操作。
Future 深入理解
Future 表示异步计算的结果,提供了一些<em>方法</em>来检查<em>是否</em>计算完成,等待计算完成和取回计算结果。 当运算完成后只能通过 get <em>方法</em>来获取结果。 <em>必要</em>时会阻塞当前线程直到计算完成。 通过cancel<em>方法</em>可以取消任务的执行。 其它<em>方法</em>用来决定任务<em>是否</em>正常执行完成还是被取消了,任务执行完成的任务不能被取消。 如果你想要使用Future的取消任务执行的功能而不不需要取得计算结果,那么你可以声明范
使用FutureTask执行并行耗时任务
在实际开发中,一般任务都有串行和并行之分。比如走完A步骤之后才能在走B步骤,这个属于串行。比如登录注册操作,只有先获取验证码,然后在使用验证码登录。又比如为了获取一个商品的价格,我们可以从多个渠道获取,从不同渠道获取商品价格是属于并行任务的,多个渠道之间完全没有任何的关系。这个时候我们一般都要搜集结果。 FutureTask就是非常适合这种情景的。 主要api有get,run,canc...
Callable和Future结合使用的一个例子
Callable有返回结果,实现Callable的线程被调用时会执行实现的call<em>方法</em>-----》Runnable无返回结果,实现Runnable借口的线程被调用时会调用run<em>方法</em>实现Callable借口的线程被作为submit<em>方法</em>的传入参数,submit<em>方法</em>被线程池(在创建该线程池的时候会指定有多少个线程可以放入线程池)调用会得到一个返回结果Future,此处T的类型来自call<em>方法</em>的返回值,就
Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不变模式和生产者-消费者模式等。这篇文章主要讲述Future模式,关于其他多线程设计模式的地址如下: 关于Future模式的详解: 关于Master-Worker模式的详解: 关于Guarded Suspeionsion模式的详解: 关于不变模式的
Promise模式简介(Future) --- Java实现异步
Promise模式简介 Promise模式是一种异步编程模式 。它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作。等到我们需要该任务的执行结果时,再调用凭据对象的相关<em>方法</em>来获取。这样就避免了不<em>必要</em>的等待,增加了系统的并发性。这好比我们去小吃店,同时点了鸭血粉丝汤和生煎包。当我们点餐付完款后,我们拿到手的其实只是一张
并行执行(Callable和Future)一定比串行执行效率高吗?
在一个程序里顺序调用了两个不相关的<em>方法</em>A和B,A耗时100毫秒,B耗时80毫秒,所以总共耗时180毫秒。 main(){ methodA; methodB; } 因为<em>方法</em>A和B不相关,所以我们可以将程序改造成并行执行,使用Callable和Future配合实现(只讨论需要A和B的返回值的情况)。 main(){ ExecutorService executor = Executo
Java中Future的使用场景和解析
我们通常都是开启一个新的子线程去执行比较耗时的代码,这使用起来非常简单,只需要将耗时的代码封装在Runnable中的run()<em>方法</em>里面,然后调用thread.start()就行。但是我相信很多人有时候都有这样的需求,就是获取子线程运行的结果,比如客户端远程调用服务(耗时服务),我们有需要得到该调用服务返回的结果,这该怎么办呢?很显然子线程运行的run()<em>方法</em>是没有返回值。这个时候Future的作用...
论dto的必要
以前刚开始工作的时候,一直纳闷展示数据为什么要用对象dto来展示,而不直接用对象,后来百度发现主要为了隐藏不需要展示的属性,用dto展示前端需要的数据,entity对应表.   刚刚敲代码的时候发现, 当更新数据用了事务,本来我想更新的是user.getEmail()的数据,但是在执行更新<em>方法</em>userDao.saveAndFlush(updateUser)后,因为事务的存在,jpa是只有等整个
JDK-Future 模式和实现
最近的项目用到了多线程,发现<em>java</em>.util.concurrent.Future蛮好用的。 像平时,写多线程一般使用Thread/Runnable,直接扔给线程池执行就好了。但是遇到了一些需要获取线程执行结果的情况,就需要使用Callable。对于使用Callable的task,ExecutorService执行后会返回一个Future对象来传递执行结果。 那这个Future是怎么存放返回值
java多线程之Future模式使用
Future模式简述 传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理。 Futrue模式下,调用方式改为异步。 Futrue模式的核心在于:充分利用主函数中的等待时间,利用等待时间处理其他任务,充分利用计算机资源。 主要角色 Main:系统启动,调用Client发出请求 Client:返回Data对象,立即返回FutureData,并开启ClientTh
AsyncTask隐藏的陷阱
AsyncTask隐藏的陷阱 分类: android 2013-04-16 16:59 277人阅读 评论(0) 收藏 举报 当AsyncTask被介绍到Android中时,它被贴上“无忧线程”的标签。其目标是让与UI线程交互的后台线程变得更容易。从这一点上讲它是成功的,但并非绝对安全————有很多AsyncTask无法应对的情况。如果不小心处理,不会考虑到Asyn
Java高并发(七)——Future模式
       大家想下,多线程处理提高性能的根本本质在哪?其实就是将串行的处理步骤进行并行的处理,其实总时间是没有缩短的。也就是以前一个人干活需要10个小时,而十个人干同样的活需要1小时,从而缩短处理时间。但是如果干活有先后限制怎么办?例如工作中:测试前必须编码,编码前必须设计,设计前必须需求分析,分析前……如何提高这种情况的性能呢?或者说是如何让这中情况下的线程更加充分利用呢?Future模式—...
Java并发编程之异步Future机制的原理和实现
Java并发编程之异步Future机制的原理和实现           项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable看下面的代码: Java代码  import <em>java</em>.util.concurrent.Callable;   impo
Java 线程组,Callable,Future,线程池,ThreadLocal类,包装线程不安全的集合
线程组和未处理的异常 Java使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,对线程组的控制相当于同时控制这批线程.用户所创建的所有线程都属于指定线程组,若没有显示指定线程组,则属于默认线程组.默认情况下子线程和创建它的副线程处于同一个线程组内;例如:A创建了B,则默认A和B处于同一个线程组. 一但加入某个线程组,则中途不能改变该线程的线程组,直到该线程死亡. Thre
通过FutureTask来实现阻塞当前线程等待其他线程处理的结果
最近在开发中遇到一个这样的需求,如:定义一个接口给第三方调用,<em>方法</em>返回的结果需要通过异步任务返回。我们可以利用FutureTask很轻松的实现,还是直接上代码吧。先自定义一个FutureTask:private static class PassFuture extends FutureTask { public PassFuture() { sup
线程池使用FutureTask时候需要注意的一点事, 获取线程执行结果
8.4 线程池使用FutureTask时候需要注意的一点事 线程池使用FutureTask的时候如果拒绝策略设置为了 DiscardPolicy和DiscardOldestPolicy并且在被拒绝的任务的Future对象上调用无参get<em>方法</em>那么调用线程会一直被阻塞。 问题复现 下面就通过一个简单的例子来复现问题: public class FutureTest { //(1)线程池单个线程,线
Future取消任务
Future取消任务: **通过Future取消那些不再需要结果的任务: //示例: /** * TimedRun * &amp;lt;p/&amp;gt; * Cancelling a task using Future */ public class TimedRun { private static final ExecutorService TASK_EXEC = Execut...
线程池Executors、Callable与Future的应用
package cn.itcast.heima;import <em>java</em>.util.Random; import <em>java</em>.util.concurrent.Callable; import <em>java</em>.util.concurrent.CompletionService; import <em>java</em>.util.concurrent.ExecutionException; import <em>java</em>.util.co
java利用线程池(ExecutorService)配合Callable和Future实现执行方法超时的阻断
今天在项目开发中需要用到对执行<em>方法</em>加上时间控制,如果<em>方法</em>执行过长则跳出执行,废话不说,直接上代码,用的是线程池配合Callable和Future方式对执行<em>方法</em>的超时阻断。希望各位牛人指正  //启用线程池 final ExecutorService exec = Executors.newFixedThreadPool(1); Callable>
Java中的Future模式原理自定义实现
Future模式类似于js中的ajax等,是一个异步获取数据的机制,这里我把自己的一些形象理解通过代码实现了一下。 该机制可以形象的理解为:调用获取数据的<em>方法</em>,首先获得一个没有装数据的空箱子(这个箱子有获取数据和装载数据的机制),至于箱子中的数据是通过另开一个线程去获取的,隔一段时间之后,当我们想要获取箱子中的数据的时候,就直接从箱子中拿就行了,一般情况下,由于获取到箱子之后到我需要从箱子中拿取
Java同步工具类——FutureTask
本文内容来自《Java并发编程实战》FutureTask也可以用作闭锁。(FutureTask实现了Future语义,表示一种抽象的可生成结果的计算。FutureTask表示的计算是通过Callable来实现的,相当于一种可生成结果的Runnable,并且可以处于以下3种状态:等待运行(Waiting to run),正在运行(Running)和运行完成(Completed)。”执行完成”表示计算的
Java 7之多线程线程池 - Callable和Future
Callable接口代表一段可以调用并返回结果的代码;Future接口表示异步任务,是还没有完成的任务给出的未来结果。所以说Callable用于产生结果,Future用于获取结果。     Java 5在concurrency包中引入了<em>java</em>.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。     Calla
FutureTask的用法及两种常用的使用场景
FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run<em>方法</em>或者放入线程池执行,之后可以在外部通过FutureTask的get<em>方法</em>异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run<em>方法</em>
java中Future的应用
Future接口是Java标准API的一部分,在<em>java</em>.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。有了Future就可以进行三段式的编程了,1.启动多线程任务2.处理其他事3.收集多线程任务结果。从而实现了非阻塞的任务调用。在途中遇到一个问题,那就是虽然能异步获取结果,但是Future的结果需要通过isdone来判断<em>是否</em>有结果,...
游戏服务器见解
文笔不好,随笔记录。 距离我进入游戏服务器开发已经快2年了,觉得应该开始把自己对服务器上的理解和想法,做下记录。 现在的游戏 普遍都是 clientlogicServercacheServer(redis)dbServer(mysql) 这样一个流程。而有的服务器在client跟logicserver之间会加入一层gateserver 也就是网关服务器,对请求进行分发,或者起
Java多线程编程-(17)-多线程异步调用之Future模式
一、线程计数器回顾在《Java多线程编程-(6)-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier》 这一篇中,我们使用线程计数器的方式实现了在主线程中等待计数的线程执行完之后在执行阻塞等待之后的代码。看段代码回顾一下:public class SummonDragonDemo { private static final int THREAD_COUNT
三种Java创建线程的方式(Callable,FutureTask)
Java线程具有并发性和异步性,可以说线程是轻量级别的进程,<em>java</em>中线程和现代操作系统中的进程调度都是采用采用抢占式运行。但线程和进程最大的区别是:一个进程中的多个进程共享这个进程的内存空间和系统资源,但是进程之间是有独立的代码段和数据段。 下面介绍三种Java创建线程的方式: 1.  通过继承Thread类创建线程 2.  通过实现Runnable接口来创建线程
Java线程池及Future、Callable获得线程返回结果
Java线程池及Future、Callable获得线程返回结果【Java线程池系列2】 Java多线程编程中,经常使用的Thread的Runnable()虽然被经常使用,但其有一个弊端,就是因为无法直接获取该线程的返回值,因为Runnable内的run<em>方法</em>,被定义为void类型,如果开发者需要在线程中处理耗时操作并获得结果,那么必须自己实现一套结果获取的途径,这其实增加了开发者的代码工作量,也可
Java之Callable 和 Future实现线程等待
1、Callable: public interface Callable 返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的<em>方法</em>。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。 Executors 类包含一些从其他普通
多线程中Future与FutureTask的区别和联系
线程的创建方式中有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,于是就有了Callable接口,Future接口与FutureTask类的配和取得返回的结果。我们先回顾一下<em>java</em>.lang.Runnable接口,就声明了run(),其返回值为void,当然就无法获取结果。public interface Run...
Java并发编程 闭锁:FutureTask、CountDownLatch、Semaphore常见使用方法
一、什么是闭锁 闭锁是一种同步工具,可以延迟线程的进度直到终止状态。可以把它理解为一扇门,当闭锁到达结束状态之前,这扇门一直是关闭的,没有任何线程可以通过。当闭锁到达结束状态时,这扇门会打开并允许所有线程通过,并且闭锁打开后不可再改变状态。 闭锁可以确保某些任务直到其他任务完成后才继续往下执行。 这篇博客只讲述这些闭锁常见用法,如果想深入了解其中原理的话请参考其它博客。 二、FutureT...
JAVA并发编程(四)任务的取消与关闭
使用简单标志位保存取消状态 为了保证标志位可靠,标志必须为volatile类型。 使用标志位来取消任务是不及时的,如果中间调用了阻塞<em>方法</em>,有可能永远都无法结束。 每个线程都有一个boolean类型的中断状态,interrupt<em>方法</em>能中断目标线程,而isInterrupted<em>方法</em>能返回目标线程的中断状态,静态的interrupted<em>方法</em>将清除当前线程的中断状态,也是清除中断状态的唯一一个<em>方法</em>。 在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的
Java线程池ExecutorService方法详解
线程在项目中有时候是很重要的一部分,对于那些不需要返回结果只需调用而且执行之间较长的<em>方法</em>,可考虑用线程实现。但是线程的频繁创建和销毁会降低系统的性能,因此多线程情况下最好要考虑线程池技术。 线程池的多种创建方式下一节介绍。 创建线程池方式: //创建可缓存线程池 没有指定线程的数量,如果第二个线程在第一个线程之后则不去创建新线程。 ExecutorService ex
文章热词 Java Java教程 Java培训 Java学习 Java价格
相关热词 c# 判断是否有方法 c++primer有必要读完嘛 c++中是否有fork() c#和java有什么区别 python有必要培训吗 有必要开展人工智能课程吗
我们是很有底线的