0

私のプロジェクトには、Thread を拡張する 3 つのクラスがあり、それぞれが整数の計算を行います。3 つの計算値すべてを取得するには、それらを実行する必要があります。このプロセスは、特定の範囲内のすべての整数に対して実行する必要があります。

これは私のスレッドの1つです:

public class FactorialNumber extends Thread {
private int number;

public void setNumber(int number) {
    this.number = number;
}

public void run() {
    try {
        sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace(); 
    }
    System.out.print(NumbersOperations.getFactorial(number));
}
}

これは、スレッドを開始しようとするメソッドです。

public static void getThreevalues() throws InterruptedException {
    int startOfRange = getBorder("Enter the left border of range: ");
    int endOfRange = getBorder("Enter the right border of range: ");
    for(int i = startOfRange; i <= endOfRange; i++) {
        PrimeNumber primeNumber = new PrimeNumber();
        FibonachiNumber fibonachiNumber = new FibonachiNumber();
        FactorialNumber factorialNumber = new FactorialNumber();
        primeNumber.setNumber(i);
        fibonachiNumber.setNumber(i);
        factorialNumber.setNumber(i);
        System.out.print("Number: " + i);
        System.out.print(" is prime number ");
        primeNumber.start();
        System.out.print(". Fibonachi - " );
        fibonachiNumber.start();
        System.out.print(". Factorial - ");
        factorialNumber.start();
        System.out.println();

    }
}

コードを実行すると、次のようになります。

Number: 3 is prime number . Fibonachi - . Factorial - 
Number: 4 is prime number . Fibonachi - . Factorial - 
Number: 5 is prime number . Fibonachi - . Factorial - 
Number: 6 is prime number . Fibonachi - . Factorial - 
true2hi6falsetrue5hi2483falsehi720hi120

私が理解しているように、start() は run() メソッドを呼び出しません。私の run メソッドには sleep(500) がありますが、結果はスリープせずにコンソールに表示されます。

私はすでにこのことに多くの時間を費やしており、残念ながら問題を解決できなかったので、助けていただければ幸いです。

4

4 に答える 4

0

結果はおそらく最後の文字列「true2hi6falsetrue5hi2483falsehi720hi120」に隠されています。すべてのスレッドが実際にコマンドを実行します:

System.out.print(NumbersOperations.getFactorial(number)); 

ループが終了すると、0.5 秒待たなければなりません。printではなく、これを行うメソッドもあるprintlnため、各結果は別の結果に「貼り付け」られます。コメントが示すように、スレッドは個別に実行されず、前のThread.

于 2013-08-29T14:25:17.637 に答える
0

そして、あなたがしなければならないことは、スレッドが終了するのを待つことです。そうしThread.join()ないと、スレッドが結果を出力できるようになる前に、プログラムが終了してスレッドを中止する可能性があります (スレッドをデーモンとしてマークしませんでしたか?)。

于 2013-08-29T17:39:48.967 に答える