`
fanshaohua110
  • 浏览: 7373 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA中FutureTask

阅读更多
在多线程的编程中你是否也为不知道其他线程是否已经结束、得不到其他线程的执行结果而苦恼。今天我们来看的FutureTask就解决了这个问题。
FutureTask:一种可以携带结果的Runnable.它的计算是通过Callable的call方法来实现的。
我们来看一下FutureTask的构造.
public class FutureTask<V> implements RunnableFuture<V>
可以看到它实现了RunnableFuture接口.
public interface RunnableFuture<V> extends Runnable, Future<V>
而RunnableFuture又实现了Runnable和Future。
Runnable接口想必大家都非常熟悉了。我们来看下Future接口

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

cancel(boolean mayInterruptIfRunning)取消任务,如果mayInterruptIfRunning设置为true,标识可以取消正在进行中的任务.返回值分为三种情况:1.任务执行中,当mayInterruptIfRunning为true时,返回true.当mayInterruptIfRunning为false时候返回false.2.任务已经完成.无论mayInterruptIfRunning为true or false 都返回false.3.任务未运行 .无论mayInterruptIfRunning为true or false 都返回true
isCancelled()任务是否被成功取消
isDone()任务是否已经完成.取消、异常、完成都属于完成。
get()阻塞只到有结果返回
get(long timeout, TimeUnit unit)指定时间内如果没有返回结果则返回NULL


我们再来看下FutureTask的构造器
public FutureTask(Callable<V> callable) 中有一个Callable参数。上面我们说过FutureTask的计算实际是通过Callable的call方法来实现的。
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接口中只有一个call方法,而且有返回值,这个返回值就是我们计算所携带的结果。
下面是FutureTask的常见用法:
1.Thread  执行FutureTask
package com.asiainfo.concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
/**
 * 可携带结果的任务.
 * 
 * 实现了Runnable接口
 */
import java.util.concurrent.FutureTask;
/**
 * Thread 方式启动FutureTask
 * @author fansh
 *
 */
public class FutureTaskTest{
	
	static FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
		public String call() throws Exception {
			return "this is the result!";
		};
	});
	private Thread thread = new Thread(future);
	
	private void start(){
		thread.start();
	}

	public static void main(String[] args) {
		FutureTaskTest test =new FutureTaskTest();
		test.start();
		try {
			String result=future.get();
			System.out.println(result);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
	}
}

2. ExecutorService启动FutureTask
package com.asiainfo.concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
/**
 * ExecutorService 方式启动FutureTask
 * @author fansh
 *
 */
public class FutureTaskTest1 {

	   static FutureTask<String> future = new FutureTask<String>(new Callable<String>(){
	        public String call(){
	            return "this is the result!";
	        }
	    });
	    
	    public static void main(String[] args) throws InterruptedException, ExecutionException{
	       ExecutorService service =Executors.newCachedThreadPool();
	       service.submit(future);
	       service.shutdown();
	       String result=future.get();
	       System.out.println(result);
	    }
	    
}


3.FutureTask 任务未启动时 取消任务
package com.asiainfo.concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
 * 1:任务尚未开始
 * @author fansh
 *
 */
public class FutureTaskCanceledTest {

	static FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
		public String call() throws Exception {
			Thread.sleep(1000);
			return "a";
		};
	});
	private Thread thread = new Thread(future);
	
	private void start(){
		thread.start();
	}

	public static void main(String[] args) {
		FutureTaskCanceledTest test =new FutureTaskCanceledTest();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//boolean flag =future.cancel(true);
		boolean flag =future.cancel(false);
		System.out.println("任务是否已经取消:"+flag);
		//保证任务取消的时候 线程尚未执行.
		test.start();
	}
}


4.FutureTask 任务完成后 取消任务
package com.asiainfo.concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
 * 1:任务已经完成
 * @author fansh
 *
 */
public class FutureTaskCanceledTest1 {

	static FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
		public String call()  {
			return "a";
		};
	});
	private Thread thread = new Thread(future);
	
	private void start(){
		thread.start();
	}

	public static void main(String[] args) {
		FutureTaskCanceledTest1 test =new FutureTaskCanceledTest1();
		test.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		boolean flag=future.cancel(false);
		//boolean flag=future.cancel(true);
		System.out.println("任务是否已经取消:"+flag);
	}
}


5. 任务进行中  响应取消动作

package com.asiainfo.concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
 * 1:任务进行中......
 * @author fansh
 *
 */
public class FutureTaskCanceledTest2 {

	static FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
		public String call()  {
			while(!Thread.currentThread().isInterrupted()){
				System.out.println("任务进行中............");
			}
			return "a";
		};
	});
	private Thread thread = new Thread(future);
	
	private void start(){
		thread.start();
	}

	public static void main(String[] args) {
		FutureTaskCanceledTest2 test =new FutureTaskCanceledTest2();
		test.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		boolean flag=future.cancel(true);
		//boolean flag=future.cancel(false);
		System.out.println("任务是否已经取消:"+flag);
	}
}

分享到:
评论

相关推荐

    Java线程池FutureTask实现原理详解

    FutureTask中有一个栈,用于存放等待线程,栈顶指针为FutureTask.waiters引用,当任务执行完毕后,会迭代唤醒整个栈中的线程,这时候,各个线程都将被唤醒,并且可以顺利拿到任务的执行结果(执行结果存于FutureTask...

    Java中Future、FutureTask原理以及与线程池的搭配使用

    Java中的`Future`和`FutureTask`是并发编程中重要的工具,它们允许程序异步执行任务并获取结果。`Future`接口提供了对异步计算结果的访问和控制,而`FutureTask`是`Future`的一个具体实现,它还同时实现了`Runnable`...

    比较java中Future与FutureTask之间的关系

    在Java中,Future和FutureTask都是用于获取线程执行的返回结果,但是它们之间存在一些差异和关联。本文将详细介绍Future和FutureTask的关系、使用和分析。 一、Future介绍 Future位于java.util.concurrent包下,是...

    Java中的Runnable,Callable,Future,FutureTask的比较

    Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...

    简谈java并发FutureTask的实现

    Java并发编程中,`FutureTask`是一个非常关键的组件,它结合了`Runnable`和`Future`接口的能力,使得我们可以在异步执行的任务完成后获取其结果。`FutureTask`不仅是一个可取消的任务,还能报告其执行状态。在这个...

    futuretask用法及使用场景介绍

    例如,在一个科学计算应用中,需要对大量数据进行计算,可以使用FutureTask和ExecutorService来实现多任务计算。 三、FutureTask的实现机制 FutureTask的实现机制是通过传入Runnable或者Callable的任务给...

    Java FutureTask类使用案例解析

    Java FutureTask类使用案例解析 Java FutureTask类是一种异步计算的工具,用于执行长时间的任务并获取结果。它实现了Runnable和Future接口,既可以作为一个Runnable对象提交给Executor执行,也可以作为一个Future...

    FutureTask学习

    `FutureTask`是Java并发编程中的一个重要组件,它位于`java.util.concurrent`包下,是`Executor`框架的一部分。这个类结合了`Runnable`或`Callable`接口的特性,并提供了异步执行的能力,同时允许你在任务完成后获取...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    在Java的多线程编程中,Spring框架提供了一种便捷的方式来管理和配置线程池,这就是`ThreadPoolTaskExecutor`。这个类是Spring对Java内置的`java.util.concurrent.ThreadPoolExecutor`的封装,允许开发者在Spring...

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    `Future`、`FutureTask`、`Callable`和`Runnable`是Java并发编程中的核心接口和类,它们在Android开发中同样有着广泛的应用。下面将详细介绍这些概念以及它们如何协同工作。 1. `Runnable`: 这是Java中最基础的多...

    JAVA线程总结,包含线程池,显示使用线程实现异步编程,基于JDK中的Future实现异步编程,JDK中的FutureTask等

    JAVA线程总结,包含线程池,显示使用线程实现异步编程,基于JDK中的Future实现异步编程,JDK中的FutureTask等

    Java 多线程与并发(17-26)-JUC线程池- FutureTask详解.pdf

    `FutureTask`是Java并发库中的一个关键组件,它实现了`RunnableFuture`接口,能够作为`Runnable`接口的实现被线程执行,同时也继承了`Future`接口,用于获取计算的结果。`FutureTask`的设计使得我们可以更加灵活地...

    FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单

    FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。在其 run() 方法中,通过 ...

    JAVA中Callable的使用

    在Java编程语言中,Callable接口是用于创建能够返回结果并可能抛出异常的线程的。与Runnable接口相比,Callable接口提供了更强大的功能,因为Runnable只能定义无返回值的任务,而Callable可以定义有返回值的任务。这...

    Java线程超时监控

    在Java编程中,多线程是并发执行任务的重要方式,然而在实际应用中,我们可能会遇到某些线程执行时间过长或死锁的情况,这可能导致系统资源的浪费甚至整体性能下降。因此,对线程进行超时监控是必要的,以确保程序的...

    揭密FutureTask.docx

    在Java并发编程中,FutureTask扮演着至关重要的角色,它是实现异步计算的关键组件。本文将深入探讨FutureTask的原理和用法,帮助开发者更好地理解和利用这个强大的工具。 一、Future接口与FutureTask概述 Future...

    java_util_concurrent中文版pdf

    《Java Util Concurrent中文版》是Java并发编程领域的重要参考资料,主要涵盖了Java标准库中的`java.util.concurrent`包及其相关类和接口。这个包是Java多线程编程的核心,提供了高效、安全的并发工具,帮助开发者...

    Java使用Callable和Future创建线程操作示例

    此外,Java中的线程创建方式还包括使用Runnable接口、Thread类、Executor框架等。不同的线程创建方式都有其优缺,需要根据实际情况选择合适的线程创建方式。 本文主要介绍了Java使用Callable和Future创建线程操作的...

    Java中实现线程的三种方式及对比_动力节点Java学院整理

    Java 中实现线程的三种方式及对比 Java 中创建线程主要有三种方式:继承 Thread 类创建线程类、通过 Runnable 接口创建线程类、通过 Callable 和 Future 创建线程。 继承 Thread 类创建线程类 继承 Thread 类创建...

    java并发编程内部分享PPT

    Executor框架中的FutureTask类结合了Future和Runnable,可以在任务完成后获取结果。 总的来说,这份“java并发编程内部分享PPT”涵盖了Java并发编程的多个重要方面,包括线程创建与管理、同步机制、并发容器、...

Global site tag (gtag.js) - Google Analytics