以下れる私の問題親スレッド5子スレッドを作成し、すべての子スレッドは結果を見つけ開始し、1子スレッドが結果それを得ます親スレッドに結果を得たことを通知し、他のすべての子スレッドを終了する必要があります。
答えて
これはまともな方法ではありません。子スレッドをコード化するだけで、もはや実行する必要のない作業をやめることができます。 「自分のコードを外部から押して、自分の望むようにするにはどうしたらいいですか?」と尋ねるときはいつでも、自分自身をやめてください。適切な質問は、「最初から実際にやりたいコードを書くことができますので、外から押し出す必要はありませんか?」
nullでない場合、親のフィールドを更新するように子を設定します。子どもにフィールドがヌルかどうかを時々チェックさせる。もしそうでなければ、彼らは止めるべきです。
は、その仕事をしていますか?
しかし、これは親クラスのメソッドを呼び出してすべてのスレッドを終了し、それがうまくいくと思うが、親スレッドがどのようにJavaのすべての子スレッドを終了できるかわからない場合、パフォーマンスのオーバーヘッドが増加する。 – user1047873
+1ブール値は、オブジェクトに対するヌルテストよりも優れた選択です(ブール変数は条件を暗黙に表し、オブジェクト変数はそうではありません)。 – kdgregory
@ user1047873 - はい、それは少しのオーバーヘッドを追加します。しかし、スレッドを終了する唯一のきれいな方法は、フラグを使用することです。 * Thread.stop()を使用しないでください。理由のために非難されています。 – kdgregory
他の子スレッドの終了が子スレッドによって実行されることが完全に受け入れられると思う。特に、子スレッドがブロッキングメソッドを使用している場合子供がアクセスできる親の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();
}
}
}
- 1. Javaのスレッドからすべての子スレッドを取得するには?
- 2. どのように - Javaのスレッド他のスレッドへのアクセス(SWING)
- 3. 子供用のイス:他のすべてのグリッド線
- 4. Javaの修飾子で他の注釈
- 5. 他のスレッド
- 6. ないすべてのスレッド()
- 7. すべてのJavaスレッドが起動しない
- 8. Java - 他のすべての予期しない例外をキャッチ
- 9. Javaのリストの親のすべての子クラス
- 10. jQueryの他のすべて
- 11. Javaのスレッド内のスレッド?
- 12. Java:スレッドを別のスレッドに渡すスレッド
- 13. スレッドは他のすべてのプロセッサタスクと比べて同じ速度で実行されますか?
- 14. プロセスのすべてのスレッドのスレッドを印刷します
- 15. Javaのスレッド:古いスレッドにJavaスレッドへの新規の
- 16. Java - 他のスレッドからオブジェクト属性を変更する
- 17. EDTとその他のスレッド関係repaint()メソッドjava
- 18. ThreadPoolExecutorスレッドは他のスレッドと競合しています
- 19. 他のスレッドがハングしているJavaスレッドがぶら下がっています(続き)
- 20. Javaプロジェクトを実行しているときのすべてのスレッド
- 21. Javaのすべての子要素がXMLで読み取る
- 22. イベントループスレッドとしてのJavaスレッド
- 23. Javaスレッド - スレッドのローカル変数
- 24. 子スレッドからの親スレッドへのコールバック
- 25. AndroidのUIスレッドと子スレッドの通信
- 26. スレッドは、すべてのスレッドがjavaを使用して出力を返すまで待機しますか?
- 27. javaスレッドのブロック
- 28. スレッドのデッドロックjava
- 29. Javaプログラムのスレッド
- 30. スレッドのベンチマークjava
私は、今日の私の不機嫌帽子を持っていた場合、私はこのhandwavingを呼ぶだろう...しかし、私はそうではありませんので、私は文句を言いません;)。 OPが自分自身に尋ねられた場合*私は実際にそれをしたいと思うことをするために自分のコードを書くことができますか?*彼の答えはおそらく*私は1つのスレッドが正しい答えを見つけると、 – OldCurmudgeon
@Paulしかし、彼は彼らがしたいことをするために他のスレッドをコード化していません。彼は自分たちがやりたいと思っていない作業をコードしており、コードの最初の部分を自分の望むものにするという仕事を他のコードにプッシュしています。私の要点は単純です。あなたのコードがあなたがやりたいことをするように書いてください。そうすれば、他の場所からやりたいことをやり遂げる方法を心配する必要はありません。 –
私はOPが自分のコードに彼がしたいことをしているので、質問を読んだ。今、彼はそれが終わる前にそれを止める方法のアドバイスを求めています。私。それらを中断する方法。 – OldCurmudgeon