java - 我怎样才能获得多线程并行计算器(阶乘和)

标签 java multithreading calculator

我将输入一些数字来计算阶乘序列的总和, 就像如果我输入 5,输出将为 1!+2!+3!+4!+5!,但是计算处理可能很繁重,所以我想使用多个步骤来计算每个阶乘..意味着 thread1 cals 1!, thread2卡尔2!... 我使用了线程数组,但无法在推进结果中同步它们。并且找不到对这些结果求和的方法。

我写了代码...

public class Calthread extends Thread{
    private int num=1;
    public Calthread(int num) {
        this.num = num;
    }

    public void run() {
        int dft = 1;
        for(int i=1; i<=num; i++) {
            dft = dft*i;
        }
        System.out.println(num + "! result :" + dft);
    }

}

这适用于 1 个线程

主类

public class calculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("input number>>");
        int k = scanner.nextInt();  //input 'k'

        int sum = 0;

        Calthread[] cal = new Calthread[k]; // make threads number of 'k'
        for(int i = 0; i<k; i++) {
            cal[i] = new Calthread(i+1);
            cal[i].start();
        }
    }

}

如何同步它们并打印所有的总和?

最佳答案

要从线程返回值,您应该使用Callable而不是Runnable:

public class Calthread implements Callable<Integer> {

    private int num = 1;

    public Calthread(int num) {
        this.num = num;
    }

    @Override
    public Integer call() {
        int dft = 1;
        for (int i = 1; i <= num; i++) {
            dft = dft * i;
        }
        return dft;
    }
}

在主类中:

public class Calculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("input number>>");
        int k = scanner.nextInt();  //input 'k'

        int sum = 0;
        // Make threads number of 'k'. Here we use List instead of array because there is such contract in ExecutorService
        List<Calthread> cal = new ArrayList<>(k);
        // Create thread pool with fixed number of threads
        ExecutorService service = Executors.newFixedThreadPool(k);
        // Add all Callable task in one collection
        for (int i = 0; i < k; i++) {
            cal.add(new Calthread(i+1));
        }
        try {
            // Invoke all Callable task and get List with results
            List<Future<Integer>> results = service.invokeAll(cal);
            // Future::get is blocking method. It waits result.
            for (Future<Integer> result : results) {
                sum += result.get();
            }
        } catch (InterruptedException | ExecutionException e) {
            System.out.println("Something went wrong");
            e.printStackTrace();
        }

        System.out.println("Result: " + sum);
        // We need to shutdown our service
        service.shutdown();
    }
}

关于java - 我怎样才能获得多线程并行计算器(阶乘和),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58900175/

相关文章:

python - UDP 服务器线程化

calculator - 使用两个以上参数计算最小值/最大值

java - 在 jpql 查询中创建和填充 pojos 并作为列表获取

Java 多态性/转换/方法

java - 暂停 SwingWorker

java - 控制语句: Why is my 'New Balance' change when I 'charge to credit' then 'pay credit' twice?

java - 按新数字时计算器会清除结果

java - 无法在 IA 32 位平台上加载 AMD 64 位 .dll

java - 我如何一次获取两个 jTextField 的文本?

java - Akka 是如何实现类似 JMM 的 happens-before 关系的?