[英]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
使用導致該概率的參數p1
和p2
進行處理。
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
會返回值。
聽起來好像還需要p1
和p2
值,所以您可能應該將其封裝在結果類型中,因此可以實現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();
}
}
請注意,我已經改變WorkerThread
到ProbabilityCalculator
-你不應該創建一個子類的實例Thread
在這里; 關鍵是讓執行者處理實際的線程; 您只需為其提供要執行的任務即可。 如果您的WorkerThread
類實際上並未擴展Thread
,則應將其重命名為避免誤導的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.