爪哇2博客
爪哇2博客

使用Callable和Future的Java 执行器服务示例

使用Callable和Future的Java 执行器服务示例

可调用接口表示可以返回值的线程。除了可以返回值之外,它与Runnable接口非常相似。可调用接口可用于计算状态或可返回给调用线程的结果。例如:’s说您想执行某些数字的阶乘和平方,您可以使用可调用接口同时执行该操作,该接口也会返回值。 可召回仅定义一种方法,如下所示

1
2
3
4
5
6
 
上市 接口 可召回 {
V 呼叫() 抛出 例外;
 
}
 

您可以在内部调用方法中定义要执行的任务。如果执行成功,则调用方法将返回结果,否则必须抛出异常。您可以使用ExecutorService’提交执行Callable任务。让’请参见ExecutorService中的Submit方法的签名。

1
2
3
 
  未来 提交(可召回 任务);
 

如果您注意到,则submit方法的返回类型为Future。
未来 是通用接口,表示将由可调用接口返回的值。由于callable会在将来的某个时间返回值,因此这里的名称似乎合适。
有两种方法可以从Future中获得实际价值。
得到(): 调用此方法时,线程将无限期等待结果。
V 得到(长超时,TimeUnit单位): 调用此方法时,线程将仅在指定时间内等待结果。

例:

该程序将演示Callable和Future的用法。我们将创建一个可调用的平方计算和一个可调用的阶乘计算。我们将向ExecutorService提交四个任务,以计算20和25的平方和阶乘。此程序将演示如何使用Callable和Future来同时执行它。
创建名为PowerCalc的类,该类实现Callable接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
组织.Arpit.爪哇2blog;
进口 爪哇.实用程序.同时.可召回;
上市 功率计算器 实施 可召回{
私人的 ;
 
功率计算器( )
 
上市 呼叫() 抛出 例外 {
{
  这个.=;
}
 
@覆写
系统..打印(“用”计算平方“+线.currentThread().得到Name());
线.睡觉(2000);
  返回 数学.战俘(, );
}
 
}
 

创建另一个名为FactorialCalc的类,该类实现Callable接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
组织.Arpit.爪哇2blog;
 
进口 爪哇.实用程序.同时.可召回;
 
上市 阶乘计算 实施 可召回 {
 
私人的 ;
 
阶乘计算( ) {
上市 呼叫() 抛出 例外 {
 
这个. = ;
}
 
@覆写
系统..打印(“使用“计算阶乘”+线.currentThread().得到Name());
线.睡觉(5000);
   事实 = 1;
  对于 (整型 i = 2; i <= ; i++) {
   事实*= i;
  }
  返回 事实;
}
}
 

 

现在创建一个名为FutureCallableMain.java的主类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
组织.Arpit.爪哇2blog;
 
进口 爪哇.实用程序.同时.ExecutionException;
进口 爪哇.实用程序.同时.执行器服务;
进口 爪哇.实用程序.同时.未来;
进口 爪哇.实用程序.同时.执行者;
 
上市 未来CallableMain {
 
执行器服务 es =执行者.新FixedThreadPool(4);
上市 静态的 虚空 主要([] args) {
  系统..打印(“开始:”);
  未来 战俘erFuture20;
 
战俘erFuture20=es .提交( 功率计算器(20));
未来 阶乘Future20;
  未来 战俘erFuture25;
  未来 因数期货25;
 
因数期货25=es .提交( 阶乘计算(25));
阶乘Future20=es .提交( 阶乘计算(20));
  战俘erFuture25=es .提交( 功率计算器(25));
   尝试 {
系统..打印(“平方”+25+”:“+战俘erFuture25.得到());
系统..打印(“平方”+20+”:“+战俘erFuture20.得到());
    系统..打印(“的基础+20+”:“+阶乘Future20.得到());
 
es .关掉();
系统..打印(“的基础+25+”:“+因数期货25.得到());
   } 抓住 (InterruptedException | ExecutionException e) {
 
    e.printStackTrace();
   }
  系统..打印(“完成”);
}
 
}
 

当您运行上述程序时,将获得以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
 
开始 :
计算中 广场 池子-1-线-1
计算中 阶乘 池子-1-线-2
计算中 广场 池子-1-线-3
广场 20 : 1.048576E26
计算中 阶乘 池子-1-线-4
阶乘 20 : 2.43290200817664E18
完成了
广场 25 : 8.881784197001253E34
阶乘 25 : 1.5511210043330986E25
 

如您所见,我们能够同时执行4个任务,这些任务返回平方和阶乘分别为20和25。

导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客