记录以下ThinkingInjava学习多线程的一个案例
package chapter21;
runTask()方法接受一个参数,表示要计算总和的斐波那契数列的数量,
并且每次调用runTask()时,它将返回对submit()的调用所产生的Future.
/**
* Create by liuw on 2022/10/2 19:45
*/
import static org.greggordon.tools.Print.*;
import java.util.concurrent.*;
import java.util.*;
class Ex10Fibonacci implements Callable<Integer> {
private Integer n = 0;
ExecutorService exec = Executors.newSingleThreadExecutor();
private int fib(int x) {
if(x < 2) return 1;
return fib(x - 2) + fib(x - 1);
}
public Integer call() {
int result = 0;
for(int i = 0; i < n; i++)
result += fib(i);
return (Integer)result;//希望在任务完成时返回一个值,可以实现Callable接口而不是Runnable接口
}
public Future<Integer> runTask(Integer n) {
this.n = n;
return exec.submit(this);//使用ExecutorService.submit()方法调用方法call() 等同于Runnable里面的start()?
}
}
public class Ex10 {
public static void main(String[] args) {
Ex10Fibonacci fib = new Ex10Fibonacci();
try {
for(int i = 0; i < 15; i++) {
print("Sum of first " + i +
" Fibonacci numbers = ");
//Future对象调用get()方法获取结果
println(fib.runTask(i).get());
}
} catch(InterruptedException e) {
System.out.println(e);
return;
} catch(ExecutionException e) {
System.out.println(e);
} finally {
fib.exec.shutdown();
}
}
}