您的位置:首页 > 其它

(10)21.2.4.1 并发 练习 5

2012-11-05 20:38 204 查看
[align=left]package jiangning.c21.ex;[/align]

[align=left]import java.util.ArrayList;[/align]
[align=left]import java.util.concurrent.Callable;[/align]
[align=left]import java.util.concurrent.ExecutionException;[/align]
[align=left]import java.util.concurrent.ExecutorService;[/align]
[align=left]import java.util.concurrent.Executors;[/align]
[align=left]import java.util.concurrent.Future;[/align]

[align=left]import net.mindview.util.Generator;[/align]

[align=left]/**[/align]
[align=left] * Java编程思想 第四版 c21 并发 [/align]
[align=left] * 练习5:修改练习2,使得计算所有斐波那契数字的数值总和的[/align]
[align=left] * 任务成为 Callable。 创建多个任务并显示结果。[/align]
[align=left] * 练习2:遵循generic/Fibonacci.java的形式,创建一个任务,[/align]
[align=left] * 它可以产生由n个斐波那契数字组成的序列,其中n是通过任务[/align]
[align=left] * 的构造器而提供的,使用线程创建大量这样的任务并驱动他们。[/align]
[align=left] * @author JiangNing[/align]
[align=left] * 2012.10.5[/align]
[align=left] *[/align]
[align=left] */[/align]
public class Exercise5 implements Callable<Integer>,Generator<Integer>
{
[align=left] private int n ;[/align]
private int count =
0;
public Integer
next() { return fib(count++);
} //实现Generator接口
[align=left] public Exercise5(){}[/align]
[align=left] public Exercise5(int n){//含有构造参数的构造器[/align]
this.n =
n;
System. out.println("Exercise5
" + n);
[align=left] }[/align]
private int fib(int n)
{ //利用递归进行调用,注意退出条件。
if(n
< 2) return 1;
return fib(n-2)
+ fib(n-1);
[align=left] }[/align]

public static void main(String[]
args) {
[align=left] ExecutorService exec = Executors. newCachedThreadPool();[/align]
[align=left] ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>();[/align]
for(int i=1;
i<10; i++){
[align=left] results.add(exec.submit( new Exercise5(i)));[/align]
[align=left] }[/align]
[align=left] Thread. yield();[/align]
[align=left] exec.shutdown();[/align]
for(Future<Integer>
fi : results){
[align=left] try {[/align]
[align=left] System. out.println(fi.get());[/align]
} catch (InterruptedException
e) {
[align=left] e.printStackTrace();[/align]
} catch (ExecutionException
e) {
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] @Override[/align]
public Integer
call() throws Exception
{
int sum
= 0;//总和
for(int i=0;
i<n; i++){
[align=left] sum = sum + next(); //求和[/align]
[align=left] }[/align]
[align=left] return sum;//返回总和[/align]
[align=left] }[/align]

[align=left]}[/align]

[align=left]/**[/align]
[align=left] * 运行结果[/align]
[align=left]Exercise5 1[/align]
[align=left]Exercise5 2[/align]
[align=left]Exercise5 3[/align]
[align=left]Exercise5 4[/align]
[align=left]Exercise5 5[/align]
[align=left]Exercise5 6[/align]
[align=left]Exercise5 7[/align]
[align=left]Exercise5 8[/align]
[align=left]Exercise5 9[/align]
[align=left]1[/align]
[align=left]2[/align]
[align=left]4[/align]
[align=left]7[/align]
[align=left]12[/align]
[align=left]20[/align]
[align=left]33[/align]
[align=left]54[/align]
[align=left]88[/align]
[align=left] */[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: