2012-07-25 92 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(); 
}