JUnit-Test führt nicht alle im Test erstellten Threads aus

Ich habe ein einfaches Beispiel für das Threading geschrieben, das Tabellen für Zahlen von 1 bis 20 generiert. Als ich es mit der main-Methode testete, führt es alle Threads aus (druckt alle Nachrichten), während nicht alle Threads ausgeführt werden (alle Nachrichten werden nicht ausgeführt) meistens (manchmal werden alle Threads ausgeführt), wenn Sie mit JUnit-Test dasselbe tun. Ich denke, es sollte keinen Unterschied in Bezug auf die Ausgabe geben.

Hier ist die Klasse mit der Hauptmethode:

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");
        }

     }

}

Wenn ich die Hauptmethode aufrufe, werden alle Ergebnisse gedruckt.

Der folgende Code für den JUnit-Test entspricht der Hauptmethode:

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");
     }
 }

}

Wenn ich den obigen Testfall durchführe, ist das Verhalten der Ausgabe in der Szene nicht konsistent, in der manchmal alle Nachrichten und meistens nur wenige gedruckt und beendet werden. Hier ist die Ausgabe, die im Fall des obigen JUnit-Testfalls erfasst wurde:

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 

Die Ausgabe endet hier, ohne die verbleibenden Nachrichten in anderen Threads zu drucken / andere Threads auszuführen.

Kann mir jemand helfen, den Grund dahinter zu verstehen? Danke im Voraus.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage