10

プロセスについて話しているとき、私たちは「親」と「子供」を持つことができることを知っています。Threadしかし、親の名前を取得することは可能ですか?

調べてみましたが、 .Netでしか答えが見つかりませんでした


編集:名前を設定してみました:

public class Main {

    public static void main(String[] args) {
        Thread r = new ThreadA();
        r.start();
    }

}



public class ThreadA extends Thread {
    public void run() {
        Thread.currentThread().setName("Thread A");
        System.out.println("Here  " + Thread.currentThread().getName());
        Thread r = new ThreadB();
        r.setName(Thread.currentThread().getName());
        r.start();
    }
}

public class ThreadB extends Thread {
    public void run() {
        Thread.currentThread().setName("Thread B");
        System.out.println("Here " + Thread.currentThread().getName());
        Thread r = new ThreadC();
        r.setName(Thread.currentThread().getName());
        r.start();
    }
}

public class ThreadC extends Thread {
    public void run() {
        Thread.currentThread().setName("Thread C");
        System.out.println("Here " + Thread.currentThread().getName());
    }
}
4

4 に答える 4

13

プロセスについて話しているとき、私たちは「親」と「子供」を持つことができることを知っています。しかし、親スレッド名を取得することは可能ですか?

スレッドには親スレッドへの参照がないため、特定のスレッドから親の名前を取得する方法はありません。コードを見ると、親スレッドはデーモンのステータス、優先度、およびその他の情報を取得するために使用されますが、名前は新しいThreadオブジェクトに保存されません。

「制御フローで一緒に行く」スレッドをグループ化できるように、スレッドの名前を付ける必要があるとおっしゃいました。私はThreadGroupsを調べます。それらはあまり頻繁には使用されませんが、この場合は使用することをお勧めします。

ThreadGroup threadGroup = new ThreadGroup("mythreadgroup");
Thread thread = new Thread(threadGroup, new Runnable() {...});
...
// then you can do such methods as
threadGroup.enumerate(...);

スレッドグループを使用すると、複数のスレッドを結び付けることができます。もちろん、コレクションを使用してこれを行うこともできます。


編集:

本当の問題は、分散システムの各コンポーネント(この場合はRMIハンドラー)で「費やされた時間」をどのように測定できるかということです。

ここでは簡単な答えはありません。壁掛け時計の場合System.currentTimeMillis()、各RMIメソッド呼び出しの開始時と終了時を比較する必要があります。次のコードを使用して、スレッドが使用するCPU時間をテストすることもできます。

ThreadInfo threadInfo =
    ManagementFactory.getThreadMXBean().getThreadCpuTime(thread.getId()); 

を使用する「ユーザー」時間を取得するにはgetThreadUserTime(...)。スレッドIDが再利用されるかどうかはわかりません。そのため、必要なのは、RMI呼び出しのすべてのスレッドIDをコレクションに記録してから、監視スレッドでCPUとユーザーの時間を記録することだけです。

RMIスレッドには特定の名前があるので、監視スレッドはスレッドリストでこれを行うスレッドを見つけることができますが、どのスレッドがどのRMI要求を処理しているかを判断することはできません。

最後に、考慮すべきことの1つは、プロセスのいくつかのポイントでタイムスタンプを取得し、これlong[]を呼び出しの間に渡すことです。これにより、データオーバーヘッドのわずかな割合が追加されますが、分散システムのさまざまな部分のパフォーマンスについて良い感覚を得ることができます。

于 2012-07-30T13:48:28.323 に答える
11

いいえ - Java または .NET のいずれにも「親」スレッドの特定の概念はありません。ただし、参照した.NETの回答によると、自分でスレッドを作成している場合は、新しいスレッドの名前内に「作成者」スレッド名を示す名前をいつでも付けることができます。

編集:サンプルコードは、開始前に名前を設定します...しかし、開始に上書きし、以前の名前を無視します。

私は次のようなものを期待します:

String currentName = Thread.currentThread.name();
Thread thread = new Thread(new RunnableC());
thread.setName("C (started by" + currentName + ")");
thread.start();

スレッドの名前が設定される唯一の場所です

これもRunnable拡張ではなく実装の考え方を使用していることに注意してくださいThread。これは別の問題ですが、ほとんどの場合に推奨される方法です。

于 2012-07-30T13:41:55.397 に答える
2

受け入れられた回答で、グレイは、スレッド ローカルが別のスレッドを開始するスレッドから継承される可能性があると述べています (つまり、親から子へ。ここでは、「親」と「子」という用語には特別な技術的意味がないことに注意してください)。

その考えに基づいて、InheritableThreadLocalを使用して親スレッドを把握する方法があるようです: 親に設定される値 ( などname) は、子で自動的に使用可能になります。


さらに、子スレッドを制御しない場合 (たとえば、スレッドでサードパーティのコンポーネントを実行し、追跡したいいくつかのスレッドを生成する場合)、このメカニズムも使用できる可能性があります。リフレクションにより、他のスレッドのスレッド ローカルを確認できます

これにより、たとえば、実行中のすべてのスレッドのスナップショットを取得し、スレッドによって開始されたスレッドや、それらのスレッドの子など、すべての子孫を把握できます。監視目的でうまく機能するはずです。それが他の何かに役立つかどうかはわかりません。

于 2016-03-09T02:58:12.087 に答える