2016-06-01 14 views
1

このようなコードで1つの「父」スレッドによって作成されたスレッドを停止する方法を知りたい。スレッドをさらに作成するスレッド

public class HiloEspecie extends Thread{ 
    private Especie especie; 
    private Procreador pro; 

    public HiloEspecie(Especie especie, Procreador pro){ 
     this.especie = especie; 
     this.pro = pro; 
    } 


    public void run() { 
     while(!pro.isEmpty()){ 
      pro.procrear(especie.getIcon(), especie.getTiempoReproduccion()); 
      HiloEspecie hijo = new HiloEspecie(especie, pro); 
      hijo.start(); 
     } 

    } 
} 

/*「hijo」スレッドの配列が必要かどうかを教えてください。または後でそれらを停止するために多分threadPool

/*編集:: あなたが私にくれたすべてのヒントをありがとう、私は実際にスレッドグループを使用して解決するために、Javaを自動的に割り当てます私がする必要があるのは、新しいスレッドグループを作成して "父"スレッドに割り当て、その後彼のすべての "子"がデフォルトで同じスレッドグループに含まれていて、最後に(注意深く)(スレッドグループ)xxyy.stop(); "父"スレッドを含むすべてのスレッドを停止します。

+0

あなたは 'ThreadGroup'を持つことができます。 – Kayaman

+0

トップレベルからスレッドを停止するのではなく、スレッドが親クラスに読み込み可能な 'flag'を設定することで自分自身を強制終了させるべきであることを知らせます。 –

+0

@ScaryWombat - または、 'Thread.interrupt()'と 'Thread.isInterrupted()'を使用して –

答えて

0

Java言語はスレッド間の親子関係を認識しませんが、あなたに役立つものがあります。java.lang.ThreadGroupクラスについて読んでください。

すべてのスレッドはスレッドグループのメンバーであり、interrupt()スレッドグループを使用できます。スレッドがすべて中断されたときに停止するように設計されていて、それらが同じThreadGroupのすべてのメンバーである場合は、ThreadGroupを中断することによってそれらのスレッドをすべて停止することができます。

4

スレッドへの参照が必要な場合は、それを停止するために「何か」を行うことができます。たとえば、それらをリストまたは配列に格納します。

Thread.stop()メソッドを呼び出すべきではないことに注意してください。単にスレッドを中断して、中断に応答するようにスレッドを実装してください。


スレッド管理をExecutorServiceに委任することもできます。 Executors.newFixedThreadPool(numThreads)RunnableまたはCallableExecutorServiceに送信すると、Futureが返ってきます。希望する場合はキャンセルできます。

タスクを早期終了させる場合は、RunnableまたはCallableと入力して割り込みを確認し、future.cancel(true)でキャンセルする必要があります。

これは、「スレッドの停止」ではなく、「タスクのキャンセル」を意味します。その区別は微妙です。 Futureは、ちょっとだけ上級で働きたいです。ひとつは、同じスレッドが再利用されるため、サブタスクごとに新しいスレッドを作成するオーバーヘッドを避けることです。

でも、Futureへの参照を保存する必要があります。配列またはリストに格納します。

+2

ExecutorServiceが確実に行く方法 –

+0

ExecutorServiceを使用する場合、それに提出されるタスクは非常に短いか、タスクを途中で終了させるための中断 – bowmore

+0

"rawスレッド"タスクとまったく同じ方法で、非常に短くするか、途中で終了する場合は中断に応答する必要があります。 –

関連する問題