簡體   English   中英

從Java中的執行程序返回結果

[英]Return results from executor in java

我需要一些幫助來從執行者那里檢索結果。 我創建工人的地方:

public static void method()
    {
        double bestProb = 0;
        double best p1 = 10000;
        double best p2 = 10000;

        executor = Executors.newFixedThreadPool(5);
        List<Future<Double>> futures = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            double p1 = Math.pow(2, i);
            for (int j = 5; j < 15; j++) {
                double p2 = Math.pow(2, j);
                Callable<Double> worker = new ProbabilityCalculator(p1, p2,);
                futures.add(executor.submit(worker));
                }
            }

        for (Future<Double> future : futures) {
             double prob = future.get();
             prob /= 100;   

                if (prob > bestProb) {
                    bestProb = prob;
                    bestp1 = p1;
                    bestp2 = p2;
                }
}

        System.out.println("Best prob: " + bestProb + ", for: " + bestp1 + ", " + bestp2);
    }

我想返回的概率是ProbabilityCalculator類,我必須在該method使用導致該概率的參數p1p2進行處理。

public class ProbabilityCalculator implements Callable<Double> {
    private double p1;
    private double p2;
    private double probability;

    private void processCommand() {
     // perform operations
     // here I compute the probability each time
    }          
    public double returnProbability() {
         return this.probability;
    }

    @Override
    public void call() {
        processCommand();
    } 
}

(此答案是在問題的修訂版1時提供的。OP正在根據問題的答案來編輯問題,這使答案變得沒有意義-而不是我嘗試跟上編輯,請參閱第1版的修訂版。看看這一切都在回應...)

如果使用Callable而不是Runnable ,則可以使用執行程序返回的future來獲取返回值。 如果需要概率,則可以使用Callable<Double>如下所示:

List<Future<Double>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    double p1 = Math.pow(2, i);
    for (int j = 5; j < 15; j++) {
        double p2 = Math.pow(2, j);
        Callable<Double> worker = new ProbabilityCalculator(p1, p2);
        futures.add(executor.submit(worker));           
    }
}
// Do whatever else you want to here...

// Now wait for the results and handle them appropriately.
// Note the exceptions that can be thrown...
for (Future<Double> future : futures) {
    double value = future.get();
    ...
}

這里重要的是Runnable不會返回值,而Callable會返回值。

聽起來好像還需要p1p2值,所以您可能應該將其封裝在結果類型中,因此可以實現Callable<ProbabilityResult> ,例如

public class ProbabilityCalculator implements Callable<ProbabilityResult> {
    private final double p1, p2;

    public ProbabilityCalculator(double p1, double p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    public ProbabilityResult call() {
        double probabilty = ...;
        return new ProbabilityResult(p1, p2, probability);
    }
}

(實際上, ProbabilityResult只是一個簡單的數據傳輸類-您可以僅將double[]與三個值一起使用,但這將非常不愉快...)

現在您可以使用:

double bestProbability = -1;
double bestP1 = 0, bestP2 = 0;
for (Future<ProbabilityResult> future : futures) {
    ProbabilityResult result = future.get();
    if (result.getProbability() > bestProbability) {
        bestProbability = result.getProbability();
        bestP1 = result.getP1();
        bestP2 = result.getP2();
    }
}

請注意,我已經改變WorkerThreadProbabilityCalculator -你應該創建一個子類的實例Thread在這里; 關鍵是讓執行者處理實際的線程; 您只需為其提供要執行的任務即可。 如果您的WorkerThread類實際上並未擴展Thread ,則應將其重命名為避免誤導的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM