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