2011-12-17 9 views
1

他のすべての子スレッドのJava

以下れる私の問題親スレッド5子スレッドを作成し、すべての子スレッドは結果を見つけ開始し、1子スレッドが結果それを得ます親スレッドに結果を得たことを通知し、他のすべての子スレッドを終了する必要があります。

答えて

2

これはまともな方法ではありません。子スレッドをコード化するだけで、もはや実行する必要のない作業をやめることができます。 「自分のコードを外部から押して、自分の望むようにするにはどうしたらいいですか?」と尋ねるときはいつでも、自分自身をやめてください。適切な質問は、「最初から実際にやりたいコードを書くことができますので、外から押し出す必要はありませんか?」

+0

私は、今日の私の不機嫌帽子を持っていた場合、私はこのhandwavingを呼ぶだろう...しかし、私はそうではありませんので、私は文句を言いません;)。 OPが自分自身に尋ねられた場合*私は実際にそれをしたいと思うことをするために自分のコードを書くことができますか?*彼の答えはおそらく*私は1つのスレッドが正しい答えを見つけると、 – OldCurmudgeon

+0

@Paulしかし、彼は彼らがしたいことをするために他のスレッドをコード化していません。彼は自分たちがやりたいと思っていない作業をコードしており、コードの最初の部分を自分の望むものにするという仕事を他のコードにプッシュしています。私の要点は単純です。あなたのコードがあなたがやりたいことをするように書いてください。そうすれば、他の場所からやりたいことをやり遂げる方法を心配する必要はありません。 –

+0

私はOPが自分のコードに彼がしたいことをしているので、質問を読んだ。今、彼はそれが終わる前にそれを止める方法のアドバイスを求めています。私。それらを中断する方法。 – OldCurmudgeon

2

nullでない場合、親のフィールドを更新するように子を設定します。子どもにフィールドがヌルかどうかを時々チェックさせる。もしそうでなければ、彼らは止めるべきです。

は、その仕事をしていますか?

+0

しかし、これは親クラスのメソッドを呼び出してすべてのスレッドを終了し、それがうまくいくと思うが、親スレッドがどのようにJavaのすべての子スレッドを終了できるかわからない場合、パフォーマンスのオーバーヘッドが増加する。 – user1047873

+0

+1ブール値は、オブジェクトに対するヌルテストよりも優れた選択です(ブール変数は条件を暗黙に表し、オブジェクト変数はそうではありません)。 – kdgregory

+0

@ user1047873 - はい、それは少しのオーバーヘッドを追加します。しかし、スレッドを終了する唯一のきれいな方法は、フラグを使用することです。 * Thread.stop()を使用しないでください。理由のために非難されています。 – kdgregory

2

他の子スレッドの終了が子スレッドによって実行されることが完全に受け入れられると思う。特に、子スレッドがブロッキングメソッドを使用している場合子供がアクセスできる親のstopメソッドが必要です。

ような何か:

public interface Stopable { 
    public void stop(); 
} 

public class Child 
    extends Thread { 
    final Stopable parent; 
    boolean foundAnswer = false; 

    Child (Stopable parent) { 
    this.parent = parent; 
    } 

    public void run() { 
    try { 
     while (!isInterrupted()) { 
     // Do some work. 
     work(); 

     if (foundAnswer) { 
      // Stop everyone. 
      parent.stop(); 
     } 
     } 
    } catch (InterruptedException ie) { 
     // Just exit when interrupted. 
    } 
    } 

    private void work() throws InterruptedException { 
    while (!foundAnswer) { 
     // Do some work. 

     // Should we stop now? 
     checkForInterrupt(); 
    } 
    } 

    private void checkForInterrupt() throws InterruptedException { 
    if (isInterrupted()) { 
     throw new InterruptedException(); 
    } 
    } 

} 

public class Mainthread 
    implements Stopable { 
    ArrayList<Child> children = new ArrayList<Child>(); 

    public void go() { 
    // Spawn a number of child threads. 
    for (int i = 0; i < 5; i++) { 
     Child newChild = new Child(this); 
     children.add(newChild); 
     newChild.start(); 
    } 
    } 

    public void stop() { 
    // Interrupt/kill all child threads. 
    for (Child c : children) { 
     c.interrupt(); 
    } 
    } 
} 
関連する問題