是否可以在每次创建新线程时告诉 JVM(或一些适当的对象)执行给定的代码块?
问问题
370 次
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 回答