`
chenzehe
  • 浏览: 538197 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

携带结果的任务Callable和Future

 
阅读更多

    Executor框架使用Runnable作为基本的任务表示形式,但是Runnable有一定的局限性:不能返回一个值或抛出一个受检查的异常。实际中很多任务都是存在延迟的,如执行数据库查询、从网络上获取资源或执行复杂计算先进,对于这样的任务,Callable是一种更好的抽象:它认为入口(call)将返回一个值并并可能抛出一个异常。

Callable

    定义:

package java.util.concurrent;
public interface Callable<V> {
    V call() throws Exception;
}

    返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。

Future

表示一个任务的生命周期,并提供了相应的方法来判断是否已经完成或取法一个任务,以及获取任务的结果和取消任务等。

定义:

package java.util.concurrent;
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;
}

 Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。

 

方法摘要:

 boolean cancel(boolean mayInterruptIfRunning) 
          试图取消对此任务的执行。 
 V get() 
          如有必要,等待计算完成,然后获取其结果。 
 V get(long timeout, TimeUnit unit) 
          如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。 
 boolean isCancelled() 
          如果在任务正常完成前将其取消,则返回 true。 
 boolean isDone() 
          如果任务已完成,则返回 true。 

 

如下代码:

package thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class FutureTest {
	public static void main(String[] args) {
		System.out.println("call start.");
		System.out.println("call:" + FutureApp.showSearch("callable......"));
		System.out.println("call finished.");
	}
}
class FutureApp {
	static ExecutorService	executor	= Executors.newFixedThreadPool(5);
	
	public static String showSearch(final String target) {
		try {
			Future<String> future = executor.submit(new Callable<String>() {
				public String call() {
					return "callable result";
				}
			});
                        executor.shutdown();
			Thread.sleep(2000); // do other things while searching
			return future.get(); // use future
		}
		catch (Exception ex) {
			return "";
		}
	}
}

call start.
call:callable result
call finished.

 

 

分享到:
评论

相关推荐

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

    Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...

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

    在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...

    Callable和Future.doc

    Callable 和 Future 在 Java 多线程编程中提供了更灵活的机制,特别是对于需要返回结果和处理异常的异步任务。Callable 通过 `call()` 方法返回结果和抛出异常,而 Future 则提供了管理和获取这些结果的手段。结合 ...

    Callable,Future的使用方式

    Callable,Future的使用方式,里面使用了三种使用方式分别是FutureTask,ExecutorService,ExecutorCompletionService

    java并发包之Callable和Future

    `Future`接口提供了获取任务结果的方法`get()`,这个方法会阻塞直到任务完成并返回结果。如果任务在执行过程中抛出异常,`get()`方法会重新抛出这个异常。此外,`Future`还提供了`isDone()`和`cancel()`等方法,用于...

    Java多线程Callable和Future接口区别

    Java多线程Callable和Future接口是Java语言中两个非常重要的接口,它们都是Java多线程编程中使用的接口,用于描述异步计算的结果。在JavaSE5中引入的Callable是一个具有类型参数的范型,他的类型参数方法表示为方法...

    java自定义任务类定时执行任务示例 callable和future接口使用方法

    它们是设计异步任务和定时任务的重要工具,特别适用于需要获取计算结果或控制任务执行流程的场景。通过结合`ExecutorService`,我们可以灵活地管理和调度多个并发任务,从而提高程序的并发性能和可维护性。

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

    总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...

    总结了Thread-Callable-Future的小demo

    自留demo,主要是Thread-Callable-Future的基本实现。 参考文章: 1、深入理解Callable https://blog.csdn.net/qq_19431333/article/details/77483763 2、彻底理解Java的Future模式: ...

    Callable:Callable与Future在Web应用中的优化案例

    1. **任务调度**:在高并发环境下,通过Callable和Future可以实现任务的异步处理,比如在Servlet容器中,可以创建一个线程池,将耗时的操作提交到线程池,然后返回Future对象给客户端,客户端可以依据Future检查任务...

    java通过Callable和Future来接收线程池的执行结果

    Java通过Callable和Future来接收线程池的执行结果 Java中的线程池执行结果获取一直是一个棘手的问题,对于直接继承Thread的方式或实现Runnable接口的方式,都无法获取到线程执行的返回结果。如果线程在执行过程中...

    详解JDK中ExecutorService与Callable和Future对线程的支持

    Java并发编程中的ExecutorService、Callable和Future ...在实际应用中,我们可以使用ExecutorService、Callable和Future来实现各种并发编程任务,如统计某个盘子的大小、统计多个盘子的总大小、实现高效的数据处理等。

    浅谈在Java中使用Callable、Future进行并行编程

    Callable使得并行任务可以返回结果,而Future则提供了管理和控制这些任务的能力,如检查任务状态、取消任务和获取结果。这种模式在多线程编程中特别有用,特别是在处理大量计算任务时,可以显著提高程序的效率。

    Runnable、Callable、Future、FutureTask有什么关联.docx

    Runnable、Callable、Future、FutureTask有什么关联.docx

    Java concurrency线程池之Callable和Future_动力节点Java学院整理

    Java concurrency线程池之Callable和Future Java concurrency是一个重要的概念,在Java编程中,线程池是一个关键组件。今天,我们将详细介绍Java concurrency线程池之Callable和Future,这两个组件在Java并发编程中...

    Callable, Future, FutureTask2

    通过合规策略对服务器进行监控,确保服务器的运行、帐号在服务器上的操作符合预设的规则...进程:监控服务器上的进程,并对某些进程、目录、文件进行标识和监控,只允许指定的进程对指定目录下的指定格式文件执行写操作

    java Callable与Future的详解及实例

    Callable 接口类似 Runnable,但提供了更丰富的功能,而 Future 对象则用于管理和控制异步计算的结果。 **Callable 接口** Callable 接口与 Runnable 相比,具有以下特点: 1. **方法不同**:Callable 接口中定义了...

    【并发编程】 — Runnable、Callable、Future和FutureTask之间的关系

    2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 ...

    Java并发编程Callable与Future的应用实例代码

    然后,我们使用Callable来定义查评论列表和查点赞列表的任务,并将其提交给线程池。最后,我们使用Future来获取Callable任务的返回值。 异步化改造接口 在上面的代码中,我们可以看到异步化改造接口的实现。我们...

    JAVA中Callable的使用

    在Java编程语言中,Callable接口是用于创建...通过结合ExecutorService和Future,我们可以方便地管理这些任务的执行,获取结果并处理可能出现的异常。熟练掌握Callable的使用对于编写高效、健壮的并发程序至关重要。

Global site tag (gtag.js) - Google Analytics