3

次のプログラムでは、新しいスレッドで開始されるmainスレッド呼び出しが呼び出されます。まで呼び出します。startThreadgreet_threadgreetstartThreadgreet_threadcount is less than or equal to 10

現在実行中のスレッド数を知る方法はありますか? より具体的には、現在実行中の への呼び出しによって開始されたスレッドの数を知りたいですgreet_threadgreet_threadというよう に、最後は一人で走るの10 timesは当たり前。10 threadsしかし、番号を知る方法はありますか?

これは、プログラムで開始されたスレッドの階層です。

main_thread
  | 
 \ /
starts a new thread by calling startThread
  |
 \ /
startThread starts a new thread by calling greet_thread-->--|
  |                                                         |
 \ /                                                       \ / gets called 10 times
 greetThread is started with an infinite loop------<------- |
  |
 \ /
 greet() method is called

class Tester {

    private static  int count = 0;

    public static void main(String args[]) {
        startThread();
    }

    public static void startThread() {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                while(count <= 10) {
                    greet_thread(count);
                    count++;
                }
            }
        };
        new Thread(r).start();
    }

    public static void greet_thread(final int count) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                while(true) {
                    greet();
                }
            }
        };
        new Thread(r).start();
    }

    public static void greet() {
        System.out.println("GREET !");
    }
}
4

2 に答える 2

3

30K のスレッドを実行している場合、問題があります。これだけ多くの CPU を持っていないのではないかと思います。スレッドの数は、VisualVM、ThreadGroup、スレッド プール、またはカウンターを使用して確認できます。

通常、プログラムを設計するときは、必要なスレッド数がわかっているため、これを確認するだけで済みます。未知の非常に多数のスレッドを使用して意図的にプログラムを作成することはありません。この数はあまり役に立ちません。

于 2013-04-08T13:28:03.383 に答える
0

まだ生きているスレッドの数を単純に数えたい場合は、runメソッドを変更して、開始時に共有カウンターをインクリメントし、終了時に (通常または例外を介して) 減少させます。

のようなものを使用してカウンターを実装する必要があることに注意してくださいAtomicInteger...または、更新を同期するために何かを行う必要があります。プリミティブ整数のインクリメントはアトミックではなく、適切に同期されていないとハイゼンバグが発生する可能性があります。

(そして、既存のcount変数についても同じです!)

于 2013-04-08T14:22:28.907 に答える