0
如果我將同一個對象傳遞給不同的Callables,然後傳遞給ExecutorService,則對象的成員是線程安全的嗎?在我的例子中,分類器具有屬性訓練數據,測試數據和網絡。所有通過調用分類器的方法在Callable的call()方法中使用。同一個分類器對象被傳遞給每個Callable。對象成員對於Callable&ExecutorService是否是線程安全的
for (int i = 0; i < this.cvCount; i++)
{
classifier.setTrainingsData(getTrainingSet(i, testSize));
classifier.setTestData(getTestSet(i, testSize));
Callable<XVErrors> callable = new ClassifierCallable<Classifier>(classifier);
Future<XVErrors> t = this.executor.submit(callable);
this.results.add(t);
}
...在ClassifierCallable
public XVErrors call() throws Exception {
XVErrors xv = new XVErrors();
xv.addTrainingError(classifier.train());
xv.addTestError(classifier.test());
return xv;
}
我有感覺,我不得不做分類對象的深層副本,並通過它,因爲當我調試例如train()方法在完成訓練之後網絡錯誤是不同的(tmp和tmp2不同)。
public TrainingError train{...
do {
trainingAlgorithm.iteration();
epoch++;
double tmp = trainingAlgorithm.getError();
} while (tmp > trainingErrorThreshold);
double tmp2 = trainingAlgorithm.getError();
...
}
因此,如上所述,我應該爲每個Callable創建新的分類器對象,如果我想讓它們獨立處理。否則,線程將修改相同的對象成員。 – 2012-02-15 07:07:12
取決於你的物體!如果你可以讓它們適合你的需求,那麼就做到這一點,如果你不能,然後複製它們。我們無法真正回答這個問題,除非您更多地告訴我們您的使用案例。 – 2012-02-15 15:36:02