次のコードを実行すると、プログラムは終了せず、予想される動作であるwhileループでスタックされます。Javaスレッド結合によってスレッドの連続実行が作成されます
public class MyClass implements Runnable {
public static final int NO_OF_THREADS = 100;
private static int count;
private static Set<Integer> set = new HashSet<>();
@Override
public void run() {
for(int i=0 ;i<10000; i++) {
set.add(count++);
}
}
public static void main(String[] args) throws Exception {
Thread[] threadArray = new Thread[NO_OF_THREADS];
for(int i=0; i<NO_OF_THREADS; i++) {
threadArray[i] = new Thread(new MyClass());
}
for(int i=0; i<NO_OF_THREADS; i++) {
threadArray[i].start();
//threadArray[i].join();
}
while(set.size()!=1000000) {}
}
}
join()のコメントを外すと、プログラムは常に終了します。さらに、スレッドが実行されるシーケンスを印刷するようにコードを修正したとき、結合を使用して、Thread-0は最初にThread-1に続いて適切な番号付けシーケンスでタスクを完了することが観察されました。
JVM スケジューラの期待された動作またはidiosyncrasiesの1つだけですか?
これは[競合条件](https://en.wikipedia.org/wiki/)です。 Race_condition) – litelite
コメントを付けると競合状態が発生しますが、コメントは解除されません。それが問題です。 – azuri
'join 'は、メインスレッドが新しいスレッドを開始する前にスレッドが終了するのを待たせるため、コメントを外したときに競合が発生しません。だから、あなたは一度に1つのスレッドしか持っていません。 – litelite