1から20までの番号のテーブルを生成するスレッドの簡単な例を書いたのですが、mainメソッドでテストしたときに、 JUnitテストでは、すべてのスレッドは実行されません(すべてのメッセージは印刷されません)。ほとんどの場合、すべてのスレッドが実行されます。私は出力の点で違いがあってはならないと思います。ここでJUnitテストでは、テスト内で作成されたすべてのスレッドが実行されていません
は、mainメソッドを持つクラスです:
public class Calculator implements Runnable {
private int number;
Calculator(final int number){
this.number = number;
}
@Override
public void run() {
for(int i = 1; i <= 10; i++){
System.out.printf("%s : %d * %d = %d \n", Thread.currentThread().getName(), number, i, number * i);
}
}
public static void main(String[] args){
Calculator calculator = null;
Thread thread = null;
for(int i = 1; i < 21; i ++){
calculator = new Calculator(i);
thread = new Thread(calculator);
System.out.println(thread.getName() + " Created");
thread.start();
System.out.println(thread.getName() + " Started");
}
}
}
私はそれがすべての結果を出力するmainメソッドを呼び出すと。
ベローがメインメソッドにJUnitテスト同等のコードである:
public class CalculatorTest {
private Calculator calculator;
private Thread thread;
@Test
public void testCalculator() {
for(int i = 1; i < 21; i ++){
calculator = new Calculator(i);
thread = new Thread(calculator);
System.out.println(thread.getName() + " Created");
thread.start();
System.out.println(thread.getName() + " Started");
}
}
}
Iは、上記のテストケースを実行すると、出力の挙動は、時にはそれがすべてのメッセージを印刷することをシーンに一貫性はありませんほとんどの場合、印刷されるのはほんのわずかで、出口です。ここで上記JUnitテストケースの場合に取り込まれ出力される。
Thread-0 Created
Thread-0 Started
Thread-1 Created
Thread-1 Started
Thread-2 Created
Thread-2 Started
Thread-3 Created
Thread-3 Started
Thread-4 Created
Thread-4 Started
Thread-5 Created
Thread-5 Started
Thread-6 Created
Thread-6 Started
Thread-7 Created
Thread-7 Started
Thread-8 Created
Thread-8 Started
Thread-9 Created
Thread-9 Started
Thread-10 Created
Thread-10 Started
Thread-11 Created
Thread-11 Started
Thread-12 Created
Thread-12 Started
Thread-13 Created
Thread-13 Started
Thread-14 Created
Thread-14 Started
Thread-15 Created
Thread-15 Started
Thread-16 Created
Thread-16 Started
Thread-17 Created
Thread-17 Started
Thread-18 Created
Thread-18 Started
Thread-19 Created
Thread-19 Started
Thread-0 : 1 * 1 = 1
Thread-0 : 1 * 2 = 2
Thread-0 : 1 * 3 = 3
Thread-0 : 1 * 4 = 4
Thread-0 : 1 * 5 = 5
Thread-0 : 1 * 6 = 6
Thread-0 : 1 * 7 = 7
Thread-0 : 1 * 8 = 8
Thread-0 : 1 * 9 = 9
Thread-0 : 1 * 10 = 10
Thread-2 : 3 * 1 = 3
Thread-2 : 3 * 2 = 6
Thread-2 : 3 * 3 = 9
Thread-2 : 3 * 4 = 12
Thread-2 : 3 * 5 = 15
Thread-2 : 3 * 6 = 18
Thread-2 : 3 * 7 = 21
出力/他のスレッド内に残っているメッセージを印刷する他のスレッドを実行せずに終了します。
誰かがこの背後にある理由を理解するのを助けることができますか?前もって感謝します。
返信ありがとうございます。やってみます。 –
OK。私はあなたの意見を持っていますが、それでも主スレッドが完了/完了するために開始したすべてのスレッドを待つ理由を理解できません。同時に、JUnitテストスレッドはこれを許可していません。あなたはそれを説明してもらえますか? –
カウントダウンラッチがどのように機能するのか尋ねていますか?それとも、すべてのスレッドが完了するまでブロックする必要があるのですか? –