0
同じオブジェクトを異なるCallableに渡してからExecutorServiceに渡すと、オブジェクトのメンバはスレッドセーフですか?私の例では、クラシファイアは、トレーニングデータ、テストデータ、およびネットワークのプロパティを持っています。すべては、Classableのメソッドを呼び出すことによってCallableのcall()メソッド内で使用されます。同じ分類子オブジェクトが各Callableに渡されます。私は、例えばデバッグするときので、私は感じているClassifierCallableオブジェクトメンバはCallable&ExecutorServiceのスレッドセーフです
public XVErrors call() throws Exception {
XVErrors xv = new XVErrors();
xv.addTrainingError(classifier.train());
xv.addTestError(classifier.test());
return xv;
}
に
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);
}
...私は、分類子オブジェクトのディープコピーを行うと、それを渡す必要があるだろう私が訓練を終えた後、train()メソッドのネットワークエラーは異なっています(tmpとtmp2は異なります)。
public TrainingError train{...
do {
trainingAlgorithm.iteration();
epoch++;
double tmp = trainingAlgorithm.getError();
} while (tmp > trainingErrorThreshold);
double tmp2 = trainingAlgorithm.getError();
...
}
上記のように、私はそれらを独立して処理したい場合は、各Callableのための新しいクラシファイアオブジェクトを作成する必要があります。それ以外の場合、スレッドは同じオブジェクトメンバを変更します。 –
あなたのオブジェクトによって異なります!必要に応じてスレッドセーフなものにすることができれば、そうすることができます。あなたのユースケースについてもっと詳しく教えない限り、その質問に本当に答えることはできません。 –