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完成,他们有一个入门教程或查看指南Add Logging at Class Load Time with Java Instrumentation,他们解释了如何以某种方式修改 Java 代码,每次添加该代码方法进入和退出。

在您的情况下,您只会对特殊方法执行此操作,无论是Thread()构造函数还是调用Thread.start().

于 2012-07-25T11:02:00.103 回答