私のコードには、発生してはならないスレッドの問題がありますが、発生しています。だから私はいくつかの回避策を作ろうとしています。できるだけ簡単なコードで問題を説明しようとします-問題が発生しているコードは大きくて複雑なので、コードを短くすると:
...................
..................
void createAndRunThreads(){
List<Path> pathList = //read path from DB readPath();
for(Path p : pathList){
RunJob rj = new RunJob(p);
Thred t = new Thread(rj);
t.start();
}
}
class RunJob implements Runnable {
private Path path;
private ExecuteJob execJob;
public RunJob(Path path){
this.path = path;
this.execJob = new ExecuteJob();
}
public void run() {
execJob.execute(path);
}
}
class ExecuteJob {
private static Job curentExecutingJob;
public void execute(Path path){
//here every thread should get different job list from others but this is not happening
//so what happens eventually two threads are executing the same Job at once and it gets messy
List<Job> jobList = getJobsFromPath(path);
for(Job job : jobList) {
curentExecutingJob=job;
//work around that I'm trying to do. So if other thread tries to run the same job has to wait on lock(I dont know if this is posible do)
synchronized(curentExecutingJob){
if(job.getStatus.equals("redy")){
//do sum initialization
//and databese changes
job.run();
}
}
}
}
}
したがって、私の懸念はこれが機能するかどうかです-ロック内のオブジェクトがメモリ(正確なオブジェクトである必要がある)またはequals(equalsを実装するために)によって比較されるかどうかはわかりません
静的な currentExecutingJob メンバーが最初のスレッドに 1 つの値オブジェクトを持ち、(同期ブロックで) その上にロックを作成し、2 番目のスレッドがその値を変更して同期ブロックに入ろうとするとどうなりますか (私が期待しているのはそのスレッドです) -2 は実行を継続し、それがブロックされるのは、以前に最初のスレッドが取得したのと同じジョブを DB から取得するときのみです)
このアプローチが可能であり、意味があるかどうかはわかりません
2 つのスレッドが、メソッド内にある次のコードを実行しています。
1 Job j = getJobByIdFromDB(1111);
2 if(j.status.equals("redye")){
3 do staff
4 make database changes
5 j.run();
6 j.state="running";
7 }
ThreadA は JVM から 3 行目で実行を停止され、その状態は実行中から実行可能に変更され、ポーリングで待機するように設定されます。
ThreadB は JVM によってチャンスを与えられ、ThreadB は、私が望んでいない行 1、2、3、4、5、6 を実行します。残りのスレッドの誰かが同じコードを入力する機会を得る前に、2 行目と 3 行目でコードに入る最初のスレッドを終了させたい
これを達成する問題は、2つのスレッドが異なるインスタンスでサンプルメソッドを実行しているため、メソッド全体が同期されていないことです-また、このメソッドで実行された他のコードがあり、それを同期させたくありませ
ん私の問題の解決策 また、synchronized(this.class){} を作成すると、マルチスレッドの利点と意味が失われます