`

Callable与Future

    博客分类:
  • java
阅读更多

java.util.concurrent.Callable与java.util.concurrent.Future类可以协助您完成Future模式。Future模式在请求发生时,会先产生一个Future对象给发出请求的客户。它的作用类似于代理(Proxy)对象,而同时所代理的真正目标对象的生成是由一个新的线程持续进行。真正的目标对象生成之后,将之设置到Future之中,而当客户端真正需要目标对象时,目标对象也已经准备好,可以让客户提取使用。

关于Future模式的说明,可以参考:

http://caterpillar.onlyfun.net/Gossip/DesignPattern/FuturePattern.htm

Callable是一个接口,与Runnable类似,包含一个必须实现的方法,可以启动为让另一个线程来执行。不过Callable工作完成后,可以传回结果对象。Callable接口的定义如下:

public interface Callable<V> {
V call() throws Exception;
}

例如,可以使用Callable完成某个费时的工作,工作结束后传回结果对象,例如求质数范例15.24:

范例15.24  PrimeCallable.java

package onlyfun.caterpillar;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;

 

public class PrimeCallable implements Callable<int[]> {
private int max;

public PrimeCallable(int max) {
 this.max = max;
}

public int[] call() throws Exception {
int[] prime = new int[max+1];

List<Integer> list = new ArrayList<Integer>();

 

for(int i = 2; i <= max; i++)
prime[i] = 1;

 

for(int i = 2; i*i <= max; i++) { // 这里可以改进
if(prime[i] == 1) {
for(int j = 2*i; j <= max; j++) {
if(j % i == 0)
prime[j] = 0;
}
}
}

 

for(int i = 2; i < max; i++) {
if(prime[i] == 1) {
list.add(i);
}
}

int[] p = new int[list.size()];
for(int i = 0; i < p.length; i++) {
 p[i] = list.get(i).intValue();
}

return p;

}

程序中的求质数方法是很简单的,但效率不好,这里只是为了示范方便,才使用简单的求质数方法,要更有效率地求质数,可以参考Eratosthenes筛选求质数:

http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/EratosthenesPrime.htm

假设现在求质数的需求是在启动PrimeCallable后的几秒之后,则可以使用Future来获得Callable执行的结果,从而在未来的时间点获得结果,例如范例15.25:

范例15.25  FutureDemo.java

package onlyfun.caterpillar;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureDemo {
public static void main(String[] args) {
Callable<int[]> primeCallable = new PrimeCallable(1000);
FutureTask<int[]> primeTask = 
new FutureTask<int[]>(primeCallable);

Thread t = new Thread(primeTask);
t.start();

try {
// 假设现在做其他事情
Thread.sleep(5000);

// 回来看看质数找好了吗
if(primeTask.isDone()) {
int[] primes = primeTask.get();
for(int prime : primes) {
System.out.print(prime + " ");
}
System.out.println();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} 
}
}

java.util.concurrent.FutureTask是一个代理,真正执行找质数功能的是Callable对象。使用另一个线程启动FutureTask,之后就可以做其他的事了。等到某个时间点,用isDone()观察任务是否完成,如果完成了,就可以获得结果。一个执行结果如下,显示所有找到的质数:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 
67 71 73 79 83 89 97 101 103 107 109 113 127 131 
137 139 149 151 157 163 167 173 179 181 191 193 
197 199 211 223 227 229 233 239 241 251 257 263 
269 271 277 281 283 293 307 311 313 317 331 337 
347 349 353 359 367 373 379 383 389 397 401 409 
419 421 431 433 439 443 449 457 461 463 467 479 
487 491 499 503 509 521 523 541 547 557 563 569 
571 577 587 593 599 601 607 613 617 619 631 641
643 647 653 659 661 673 677 683 691 701 709 719
727 733 739 743 751 757 761 769 773 787 797 809 
811 821 823 827 829 839 853 857 859 863 877 881 
883 887 907 911 919 929 937 941 947 953 967 971 
977 983 991 997

用户可能需要快速翻页浏览文件,但在浏览到有图片的页数时,由于图片文件很大,导致图片加载较慢,造成用户浏览文件时会有停顿的现象。因此希望在文件开启之后,仍有一个后台作业持续加载图片。这样,用户在快速浏览页面时,所造成的停顿可以获得改善,从而可以考虑使用这里所介绍的功能

分享到:
评论

相关推荐

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

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

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

    与Runnable接口不同,Callable可以有返回值,而且能够抛出异常。当我们需要在线程执行过程中获取某些计算结果时,Callable就非常适用。下面是一个简单的Callable示例: ```java public class MyTask implements ...

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

    Java并发编程Callable与Future的应用实例代码 在Java并发编程中,Callable与Future是两个非常重要的概念,它们通常结合使用来实现异步编程。在本文中,我们将详细介绍Callable与Future的应用实例代码,并探究它们在...

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

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

    Callable,Future的使用方式

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

    java Callable与Future的详解及实例

    Callable 接口与 Runnable 相比,具有以下特点: 1. **方法不同**:Callable 接口中定义了 `call()` 方法,而 Runnable 接口中有 `run()` 方法。 2. **返回值**:Callable 的 `call()` 方法可以返回一个泛型结果 V,...

    Callable和Future.doc

    Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...

    java并发包之Callable和Future

    Future&lt;Integer&gt; future1 = threadPool.submit(new Callable() { public Integer call() throws Exception { return computeSomething1(); } }); Future&lt;Integer&gt; future2 = threadPool.submit(new Callable...

    总结了Thread-Callable-Future的小demo

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

    Java多线程Callable和Future接口区别

    "Java多线程Callable和Future接口区别" Java多线程Callable和Future接口是Java语言中两个非常重要的接口,它们都是Java多线程编程中使用的接口,用于描述异步计算的结果。在JavaSE5中引入的Callable是一个具有类型...

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

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

    Callable, Future, FutureTask2

    通过合规策略对服务器进行监控,确保服务器的运行、帐号在服务器上的操作符合预设的规则。日志:收集、整理服务器的日志信息,提供给管理员查看,并作为异常判断、故障排查的依据。进程:监控服务器上的进程,并对...

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

    Java并发编程中的ExecutorService、Callable和Future Java并发编程中,ExecutorService、Callable和Future是三大核心组件,它们之间紧密相连,共同实现了高效、安全的并发编程。下面我们将详细介绍这些组件的作用和...

    JAVA多线程实现的四种方式 - FelixZh - 博客园1

    在Java中,实现多线程有四种主要方式:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细阐述这四种方式。 1. 继承Thread类 当你需要创建一个新的线程类时,可以继承Thread...

    Java多线程实现的四种方式

    在Java中,实现多线程有四种主要方法:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细探讨这四种方式。 1. 继承Thread类 在Java中,我们可以直接继承Thread类并重写其run...

    【并发编程】 — 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接口与Runnable接口类似,但它具有一个泛型方法`call()`,该方法在执行时会返回一个结果,并可能抛出异常。Callable接口的定义如下: ```java public interface Callable&lt;V&gt; { V call() throws Exception;...

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics