2012-07-25 94 views
2

是否有可能在每次创建新线程时告诉JVM(或某个适当的对象)执行给定的代码块?为每个新线程执行代码?

+1

创建或开始? – aioobe 2012-07-25 08:31:51

+1

这是创建线程时的正常行为。对不起,但不能抵抗.. 2012-07-25 08:36:22

+0

你可以修改Thread类,但只有在没有其他选项的情况下。 – 2012-07-25 09:23:30

回答

3

这取决于你的使用情况,但你也可以做Java字节code instrumentation。然而,这通常用于测量,错误跟踪,分析等,因为它具有明显的性能影响。

这可以用ASM做了,他们有一个tutorial上手还是先看看在引导Add Logging at Class Load Time with Java Instrumentation,他们解释如何修改Java代码的方式,每次输入一个方法时,该代码被添加和退出。

在你的情况下,你只会对特殊方法,Thread()构造函数或调用Thread.start()

6

不,不使用标准Java。

看看面向方面的编程,如AspectJ。您应该可以为Thread构造函数创建一个切点。

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(); 
}