callable接口与斐波那契数列应用列子

记录以下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();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值