2

開始された子スレッドの複数のインスタンスがあり、アプリケーションが終了するまで実行し続ける必要があります。

Task を拡張するクラスがあり、次のようにスレッドを作成します。

new Thread(object of the class).start();

すべてのスレッドは、プライマリ ステージの終了時に終了する必要があります。

primaryStage.onCloseOperation(){...}
4

3 に答える 3

1

を使用ThreadGroupしてすべてのスレッドをグループ化し、それらの動作を制御することを検討する必要があります。Java 5 では、状態情報を取得するために java.lang.management に ThreadInfo および ThreadMXBean クラスが追加されました。

ここで利用可能なチュートリアルを使用してこれを達成するためのサンプル例を次に示しますhttp://nadeausoftware.com/articles/2008/04/java_tip_how_list_and_find_threads_and_thread_groups :

すべてのスレッドのリストを取得する

ThreadGroup の別の enumerate( ) メソッドは、そのグループのスレッドをリストします。2 番目の引数が true の場合、グループを再帰的にトラバースして、指定された配列に Thread オブジェクトを入力します。ルート ThreadGroup から開始すると、JVM 内のすべてのスレッドのリストが表示されます。

ここでの問題は、スレッド グループを一覧表示する場合と同じです。enumerate( ) に渡す配列が小さすぎる場合、一部のスレッドが返された配列から暗黙のうちに削除される可能性があります。そのため、配列のサイズを推測し、enumerate( ) を呼び出して、戻り値を確認し、配列がいっぱいの場合は再試行する必要があります。適切な出発点を得るには、java.lang.management パッケージを調べてください。そこにある ManagementFactory クラスは、getThreadCount( ) メソッドが JVM 内のスレッドの総数を返す ThreadMXBean を返します。もちろん、これは後で変更される可能性がありますが、最初の推測としては適切です。

Thread[] getAllThreads( ) {
    final ThreadGroup root = getRootThreadGroup( );
    final ThreadMXBean thbean = ManagementFactory.getThreadMXBean( );
    int nAlloc = thbean.getThreadCount( );
    int n = 0;
    Thread[] threads;
    do {
        nAlloc *= 2;
        threads = new Thread[ nAlloc ];
        n = root.enumerate( threads, true );
    } while ( n == nAlloc );
    return java.util.Arrays.copyOf( threads, n );
}
于 2013-09-12T05:50:34.690 に答える
0

デーモン スレッドを作成するExecutorServiceを持つを作成します。ThreadFactory

例えば ​​:

ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() {
     @Override
     public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setDaemon(true);
        return thread;
     }
});

残りの使用方法は、@Enno によって既に述べられています。

ありがとうエンノ:)

于 2013-09-12T15:27:06.683 に答える