第六章使用Callable和Future的JavaExecutorService示例|
可调用接口表示可以返回值的线程。它与 Runnable 接口非常相似,只是它可以返回一个值。可调用接口可用于计算可以返回给调用线程的状态或结果。例如:假设您要执行某些数字的阶乘和平方,您可以使用可调用接口同时执行,该接口也将返回值。Callable 仅定义了一种方法,如下所示
public interface Callable {
V call() throws Exception;
}
您可以在调用方法中定义要执行的任务。如果执行成功,调用方法将返回结果,否则必须抛出异常。您可以使用 ExecutorService 的提交来执行 Callable 任务。让我们看看ExecutorService中submit方法的签名
Future submit(Callable task);
如果您注意到,提交方法的返回类型是 Future。
Future是通用接口,表示将由可调用接口返回的值。由于 callable 将在未来某个时间返回值,因此 name 在这里似乎很合适。
有两种方法可以从 Future 获取实际值。
get() :调用此方法时,线程将无限期等待结果。
V get(long timeout, TimeUnit unit) :当这个方法被调用时,线程只会在指定的时间内等待结果。
例子:
该程序将演示 Callable 和 Future 的使用。我们将创建一个用于计算平方的可调用对象和一个用于阶乘的调用对象。我们将向 ExecutorService 提交四个任务,用于计算 20 和 25 的平方和阶乘。这个程序将演示如何使用 Callable 和 Future 来同时执行它。
创建名为 PowerCalc 的类,该类实现 Callable 接口。
package org.arpit.java2blog;
import java.util.concurrent.Callable;
public class PowerCalc implements Callable{
private double number;
PowerCalc(double number)
public Double call() throws Exception {
{
this.number=number;
}
@Override
System.out.println("Calculating Square with "+Thread.currentThread().getName());
Thread.sleep(2000);
return Math.pow(number, number);
}
}
创建另一个名为 FactorialCalc 的类,它实现了 Callable 接口。
package org.arpit.java2blog;
import java.util.concurrent.Callable;
public class FactorialCalc implements Callable {
private double number;
FactorialCalc(double number) {
public Double call() throws Exception {
this.number = number;
}
@Override
System.out.println("Calculating factorial with "+Thread.currentThread().getName());
Thread.sleep(5000);
double fact = 1;
for (int i = 2; i <= number; i++) {
fact *= i;
}
return fact;
}
}
现在创建一个名为 FutureCallableMain.java 的主类。
package org.arpit.java2blog;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.Executors;
public class FutureCallableMain {
ExecutorService es=Executors.newFixedThreadPool(4);
public static void main(String[] args) {
System.out.println("Start : ");
Future powerFuture20;
powerFuture20=es.submit(new PowerCalc(20));
Future factorialFuture20;
Future powerFuture25;
Future factorialFuture25;
factorialFuture25=es.submit(new FactorialCalc(25));
factorialFuture20=es.submit(new FactorialCalc(20));
powerFuture25=es.submit(new PowerCalc(25));
try {
System.out.println("Square of "+25+" : "+powerFuture25.get());
System.out.println("Square of "+20+" : "+powerFuture20.get());
System.out.println("Factorial of "+20+" : "+factorialFuture20.get());
es.shutdown();
System.out.println("Factorial of "+25+" : "+factorialFuture25.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println("Done");
}
}
当你运行上面的程序时,你会得到下面的输出:
Start :
Calculating Square with pool-1-thread-1
Calculating factorial with pool-1-thread-2
Calculating Square with pool-1-thread-3
Square of 20 : 1.048576E26
Calculating factorial with pool-1-thread-4
Factorial of 20 : 2.43290200817664E18
Done
Square of 25 : 8.881784197001253E34
Factorial of 25 : 1.5511210043330986E25
如您所见,我们能够同时执行 4 个任务,它们返回 20 和 25 的平方和阶乘。
相关文章:
相关推荐:
- [其它]第三章java中的抽象类|
- [其它]第四章java中的TreeMap与示例|
- [其它]第四章java中的hashcode()和equals()方法|
- [其它]第六章JavaFutureTask示例|
- [其它]计算机组成原理PDF扫描格式电子版百度云网盘下载
- [其它]程序设计语言概念(第9版)[Robert W. Sebesta]pdf格式电子版百度云网盘下载[53.8M]
- [其它]程序员必读之软件架构[Simon Brown]pdf格式电子版百度云网盘下载[41.6M]
- [其它]程序员的思维修炼 开发认知潜能的九堂课[Andy Hunt]pdf格式电子版百度云网盘下载
- [其它]程序员的职业素养[Robert C. Martin]pdf格式电子版百度云网盘下载[21.6M]
- [其它]程序员教程(第3版)[张淑平]pdf格式电子版百度云网盘下载[136.5M]
- 计算机组成原理PDF扫描格式电子版百度云网盘下载
- 硅谷之谜[吴军]pdf格式电子版百度云网盘下载[59.5M]
- 七周七语言 理解多种编程范型[Bruce A. Tate]pdf格式电子版百度云网盘下载[9M]
- 系统集成项目管理工程师考试考眼分析与样卷解析(2014版)[软考新大纲研究组]
- 自选基金助手,一款Chrome扩展程序
- 程序员面试金典(第5版)[Gayle Laakmann McDowell]pdf格式电子版百度云网盘下载[81.5M]
- 创业维艰 如何完成比难更难的事[Ben Horowitz]pdf格式电子版百度云网盘下载[65.3
- 程序员的思维修炼 开发认知潜能的九堂课[Andy Hunt]pdf格式电子版百度云网盘下载
- 图灵的秘密 他的生平、思想及论文解读[Charles Petzold]pdf格式电子版百度云网盘下
- OCP OCA认证考试指南全册:Oracle Database 11g(1Z0-051、1Z0-052、1Z0-053)[John Watson]pdf格式