每次创建新线程时,是否可以告诉JVM(或某些适当的对象)执行给定的代码块?
答案 0 :(得分:6)
不,不使用标准Java。
查看面向方面的编程,例如AspectJ。您应该可以为Thread构造函数创建一个切入点。
答案 1 :(得分: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();
}
答案 2 :(得分:3)
这取决于您的用例,但您也可以使用Java字节code instrumentation。但是,这通常用于测量,错误跟踪,分析等,因为它会对性能产生显着影响。
这可以使用ASM来完成,他们有一个tutorial来开始或者查看指南Add Logging at Class Load Time with Java Instrumentation,他们解释了如何以某种方式修改Java代码,每次进入和退出方法时都会添加该代码。
在您的情况下,您只能对特殊方法执行此操作,Thread()
构造函数或Thread.start()
的调用。