package jiangning.c21.ex;
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import net.mindview.util.Generator;
/**
* Java编程思想 第四版 c21 并发
* 练习5:修改练习2,使得计算所有斐波那契数字的数值总和的
* 任务成为 Callable。 创建多个任务并显示结果。
* 练习2:遵循generic/Fibonacci.java的形式,创建一个任务,
* 它可以产生由n个斐波那契数字组成的序列,其中n是通过任务
* 的构造器而提供的,使用线程创建大量这样的任务并驱动他们。
* @author JiangNing
* 2012.10.5
*
*/
public class Exercise5 implements Callable<Integer>,Generator<Integer>
{
private int n ;
private int count =
0;
public Integer
next() { return fib(count++);
} //实现Generator接口
public Exercise5(){}
public Exercise5(int n){//含有构造参数的构造器
this.n =
n;
System. out.println("Exercise5
" + n);
}
private int fib(int n)
{ //利用递归进行调用,注意退出条件。
if(n
< 2) return 1;
return fib(n-2)
+ fib(n-1);
}
public static void main(String[]
args) {
ExecutorService exec = Executors. newCachedThreadPool();
ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>();
for(int i=1;
i<10; i++){
results.add(exec.submit( new Exercise5(i)));
}
Thread. yield();
exec.shutdown();
for(Future<Integer>
fi : results){
try {
System. out.println(fi.get());
} catch (InterruptedException
e) {
e.printStackTrace();
} catch (ExecutionException
e) {
e.printStackTrace();
}
}
}
@Override
public Integer
call() throws Exception
{
int sum
= 0;//总和
for(int i=0;
i<n; i++){
sum = sum + next(); //求和
}
return sum;//返回总和
}
}
/**
* 运行结果
Exercise5 1
Exercise5 2
Exercise5 3
Exercise5 4
Exercise5 5
Exercise5 6
Exercise5 7
Exercise5 8
Exercise5 9
1
2
4
7
12
20
33
54
88
*/