2017-05-03 16 views
3

私はスレッドを含むことを試みている簡単な練習をしています。Javaスレッドが起動しない

(a)RunAnableを実装するSumActionというクラスを作成します。 クラスには、start、end、およびsumの3つのインスタンス変数が含まれています。 startとendはコンストラクタによって初期化されます。 sumは0に設定されます。

(b)run()メソッドは、開始から終了までのすべての値の合計を求めるforループを持つ必要があります。 sumの値を返すにはgetSum()メソッドが必要です。主に

(C)本のRunnableクラスの2つのインスタンス、パラメータとして1と10を取るを作成し、他の10および20

をとる(d)は、ねじ山を作るために2つのスレッドコンストラクタにこれらのインスタンスを渡しt1およびt2。

(e)スレッドが終了したら、getSumを呼び出して両方のスレッドから合計値を取得し、全体の合計を求めます。

私はこれを正しくやっていると確信していますが、私はまだ0の合計値を返しています。

はここにここに私のクラス

public class SumAction implements Runnable { 

private int start, end, sum; 

public SumAction(int start, int end) { 
    this.start = start; 
    this.end = end; 
    sum = 0; 
} 

@Override 
public void run() 
{ 

    for (int i = start+1; i < end; i++) 
    { 
     sum += i; 
    } 

} 

public int getSum() { 
    return sum; 
} 
} 

あるスレッドが終了するのをあなたが待っていない主な

SumAction run1 = new SumAction(1, 10); 

    SumAction run2 = new SumAction(10, 20); 

    Thread t1= new Thread(run1); 

    Thread t2= new Thread(run2); 


    t1.start(); 

    t2.start(); 


    System.out.println("Sum 1 : " + run1.getSum()); 

    System.out.println("Sum 2 : " + run2.getSum()); 
+0

スレッドが終了する前に合計を印刷している可能性があります。 – Berger

+0

両方のスレッドのjoinメソッドを使用する –

答えて

8

です。メインスレッドは、他のスレッドが計算を完了する前に、または開始前にgetSumを呼び出すことができます。また、スレッドがprintlnの前に終了しても、更新された値がメインスレッドに見えない可能性があります。

コールは、それらが終了したゴマ待つようにスレッドに参加し、スレッドを起動した後とprintlns前にこれを追加します。

t1.join(); 
t2.join(); 

これは確かになり、他のスレッドが印刷しようとする前に終了するまで、メインスレッドが待機また、可視性の問題を処理します。

多くの場合、別のスレッドによって書き込まれたフィールドから読み込まれたスレッドには、十分な予防措置(同期化、フィールドの揮発性化など)があると問題があります(バグ、実装依存、 )は取られません。しかし、このコードでは、joinを呼び出すと、適用可能な先行ルールが存在するため、メインスレッドがgetSumの最新値を確認するための追加同期は必要ありません。 Oracle tutorialから引用:

スレッドが終了して返すために別のスレッドでThread.joinを起こし

、その後、終了したスレッドで実行されるすべての文は、事前発生の成功が参加、以下のすべての文と関係を持っています。スレッド内のコードの影響は、結合を実行したスレッドに表示されるようになりました。

joinメソッドはInterruptedExceptionをスローします。InterruptedExceptionは、スレッドが割り込みフラグを設定した後にスリープ状態または待機状態になった場合にスローされるチェック例外です。実際に何かを中断していない簡単なサンプルプログラムの場合は、mainメソッドのthrows節に追加することができます。

関連する問題