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
*/