13

現在実行中のスレッドの数を確認する方法を探しています

  1. 最初にWindowsを介して
  2. プログラムで
4

5 に答える 5

31

これにより、VM内のスレッドの総数がわかります。

int nbThreads =  Thread.getAllStackTraces().keySet().size();

ここで、すべてのスレッドを現在実行したい場合は、次のようにすることができます。

int nbRunning = 0;
for (Thread t : Thread.getAllStackTraces().keySet()) {
    if (t.getState()==Thread.State.RUNNABLE) nbRunning++;
}

可能な状態はここに列挙されています:Thread.State javadoc

プログラムではなくWindowsツールで実行中のスレッドを確認したい場合は、ProcessExplorerを使用できます

于 2012-07-18T08:16:56.963 に答える
5

JVMで実行されているすべてのスレッドとそのスタックトレースを取得するには、Thread.getAllStackTraces()を使用します。

于 2012-07-18T08:15:01.410 に答える
1

あなたの次のコメントに応えて

次のコードでは、while(resultSet.next()){name = resultSet.getString( "hName"); MyRunnableワーカー=newMyRunnable(hName); threadExecutor.execute(worker); }。スレッドプールのサイズは10です。プログラムがマルチスレッドで正しく動作していることを確認し、特定の瞬間に実行されているスレッドの数を確認する必要があります。これどうやってするの?

別の答えとして、JVisualVMを使用してコードのプロファイルを作成し、スレッドプールが正常に機能しているかどうかを確認することをお勧めします。この提案の背後にある理由は、JVMが管理する他のすべてのハウスキーピングスレッドを気にする必要がないためです。あなたがやりたいことに加えて、JVisualVMのようなツールが作られている理由があります。

Javaプログラムのプロファイリングに慣れていない場合、JVisualVMを使用すると、コードの実行中に内部で何が起こっているかを確認できます。ヒープ、GCアクティビティを確認し、CPUまたはメモリ使用量のサンプル/プロファイルを実行/待機しているスレッドを検査できます。プラグインもかなりあります。

于 2012-07-18T08:32:46.890 に答える
0

Windowsから:

それを伝えることができるプロセスのパフォーマンスカウンターが必ずあります。

プログラムで:

ありますThread#activeCount

現在のスレッドのスレッドグループとそのサブグループ内のアクティブなスレッドの推定数を返します。現在のスレッドのスレッドグループ内のすべてのサブグループを再帰的に繰り返します。

またはもっと直接的に、ThreadGroup#activeCount

このスレッドグループとそのサブグループ内のアクティブなスレッドの推定数を返します。

およびThreadGroup#getParent

このスレッドグループの親を返します。

まず、親がnullでない場合、親スレッドグループのcheckAccessメソッドが引数なしで呼び出されます。これにより、セキュリティ例外が発生する可能性があります。

これらはすべて、次のようなものを示唆しているようです。

int activeThreadTotalEstimate() {
    ThreadGroup group;
    ThreadGroup parent;

    group = Thread.currentThread().getThreadGroup();
    while ((parent = group.getParent()) != null) {
        group = parent;
    }
    return group.activeCount();
}
于 2012-07-18T08:14:58.423 に答える
0

コードスニペット:

import java.util.Set;
import java.lang.Thread.State;
public class ActiveThreads {
    public static void main(String args[]) throws Exception{
        for ( int i=0; i< 5; i++){
            Thread t = new Thread(new MyThread());
            t.setName("MyThread:"+i);
            t.start();
        }
        int threadCount = 0;
        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        for ( Thread t : threadSet){
            if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup() && 
                t.getState() == Thread.State.RUNNABLE){
                System.out.println("Thread :"+t+":"+"state:"+t.getState());
                ++threadCount;
            }
        }
        System.out.println("Thread count started by Main thread:"+threadCount);
    }
}

class MyThread implements Runnable{
    public void run(){
        try{
            Thread.sleep(2000);
        }catch(Exception err){
            err.printStackTrace();
        }
    }
}

出力:

Thread :Thread[main,5,main]:state:RUNNABLE
Thread count started by Main thread:1

説明:

Thread.getAllStackTraces().keySet()両方によって開始されたすべてのスレッドのリストを提供しますProgram and System。条件がないThreadeGroup場合、システムスレッドカウントがアクティブであると取得されます。

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer

于 2016-08-03T12:15:23.823 に答える