2

新しいスレッドが作成されるたびに、特定のコード ブロックを実行するように JVM (または適切なオブジェクト) に指示することは可能ですか?

4

3 に答える 3

6

いいえ、標準 Java を使用していません。

AspectJなどのアスペクト指向プログラミングをご覧ください。Thread コンストラクターのポイントカットを作成できるはずです。

于 2012-07-25T08:31:24.543 に答える
4

新しいスレッドが作成されるたびにではありません。ただし、ThreadPoolExecutor を使用して新しいスレッドを作成する場合は、ThreadFactory を指定して、そのファクトリによってスレッドが作成されるたびに特定のコード ブロックを実行できます。簡単な例 (実行するコードのブロックがスレッドの名前を出力する場所) は次のようになります。

public static void main(String[] args) {
    ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() {

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            System.out.println("New thread created: " + t); //Your block of code
            return t;
        }
    });

    Runnable r = new Runnable() {

        @Override
        public void run() {
            try {
                Thread.sleep(150);
            } catch (InterruptedException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    };

    for (int i = 0; i < 5; i++) {
        executor.submit(r);
    }

    executor.shutdown();
}
于 2012-07-25T08:54:44.197 に答える
3

ユース ケースによって異なりますが、Java バイトコード インスツルメンテーションを実行することもできます。ただし、これはパフォーマンスに顕著な影響を与えるため、通常は測定、エラー追跡、プロファイリングなどに使用されます。

これはASMで行うことができます。開始するためのチュートリアルがあるか、Java Instrumentation を使用してクラスのロード時にログを追加するガイドを参照してください。Java コードを何らかの方法で変更する方法が説明されています。メソッドに入り、終了します。

あなたの場合、Thread()コンストラクターまたは の呼び出しのいずれかの特別なメソッドに対してのみこれを行いますThread.start()

于 2012-07-25T11:02:00.103 に答える