2012-09-19 120 views
6

是否有可能在java中編寫線程創建監聽器?例如使用aop ?!線程創建監聽器

我的意思是這樣的,如果我的應用程序創建一個線程,我想註冊這個對象在我自己的表,容器或其他東西。

+1

如果你在主線程中註冊了一個'ClassLoader',希望這將會被所有新線程繼承,並且希望任何線程都需要加載一些類,這意味着你的'ClassLoader'將會被查詢,並且你有一個機會來註冊線程.... – Saintali

+0

我會通過擴展'線程'的方式爲聽衆所需的方法。當然,只能用於你的代碼。 – SJuan76

+0

您是否需要跟蹤轉換(例如:「現在創建了一個新的線程,我必須立即對它做出反應」),還是足以讓您的應用程序創建一個或多個線程列表特定的時間點(比如:「現在我想知道線程並對它們做些什麼。」)? – Fildor

回答

1

我認爲這將有可能與AOP(AspectJ的舉例)。但是仍然需要創建自己的ThreadThreadGroup/Executor類型,除非可以使用方面編譯器重新編譯JDK類。如果要註冊線程啓動或池的createThread(如果要註冊創建線程對象),請在線程的start方法上定義切入點。


只有當你重新編譯JDK與編譯器方面的以下工作: 所有線程都開始Thread.start,所以寫了這個方法,那麼你可以使用建議做你想要什麼的切入點。當然這並不完美,因爲例如一個cachedThreadPool執行器可能不會爲每個任務啓動一個新線程,但是如果你在Runnable.runCallable.call而不是Thread.start上註冊一個切入點,那可能就足夠了。

+0

這可能適用於運行線程,但問題是關於創建線程而不是線程正在運行的線程。 – user454322

+0

@ user454322編號A在線程啓動時,建議將被調用。 (即這三種方法中的任何一種被調用) – zeller

+0

我知道它將在線程_are started_之前被調用,但會在線程_re created_時被調用? 例如,如果線程是_created_但從未_started_會發生什麼? – user454322

4

我會創建一個線程,不斷列出JVM上所有正在運行的線程。
然後,每次它不確定一個新線程出現時,它會以任何方式通知您的代碼中的一個類。

下面是關於如何列出所有線程當前運行在JVM上的一些鏈接:

  1. Get a List of all Threads currently running in Java

  2. Listing All Running Threads

========= ===

A起始碼:

ThreadCreationListener.java

public interface ThreadCreationListener { 
    public void onThreadCreation(Thread newThread); 
} 

ThreadCreationMonitor.java

public class ThreadCreationMonitor extends Thread { 
    private List<ThreadCreationListener> listeners; 
    private boolean canGo; 

    public ThreadCreationMonitor() { 
     listeners = new Vector<ThreadCreationListener>();//Vector class is used because many threads may use a ThreadCreationMonitor instance. 
     canGo = true; 
     // Initialize the rest of the class here... 
    } 

    // Most important methods 
    public void addListener(ThreadCreationListener tcl) { 
     listeners.add(tcl); 
    } 

    public void removeListener(ThreadCreationListener tcl) { 
     listeners.remove(tcl); 
    } 

    public void run() { 
     List<Thread> runningThreads; 
     List<Thread> lastRunningThreads; 

     while(canGo) { 
      // Step 1 - List all running threads (see previous links) 
      // runningThreads = ... 

      // Step 2 - Check for new threads and notify all listeners if necessary 
      if (runningThreads.removeAll(lastRunningThreads)==true) { 
       for(Thread t : runningThreads) { 
        for(ThreadCreationListener tcl : listeners) { 
         tcl.onThreadCreation(t);//Notify listener 
        } 
       } 
      } 
     } 
    } 

    public void shutdown() { 
     canGo = false; 
    } 

}

MyThreadInfoConsumer.java

public class MyThreadInfoConsumer implements ThreadCreationListener { 
    public void onThreadCreation(Thread newThread) { 
     // Process here the notification... 
    } 
} 

Main.java

public class Main { 
    public static void main(String[] args) { 
     ThreadCreationMonitor tcm = new ThreadCreationMonitor(); 
     tcm.start(); 

     MyThreadInfoConsumer myTIC = new MyThreadInfoConsumer(); 
     tcm.addListener(myTIC); 

     // rest of your code... 
     // Don't forget to call tcm.shutdown() when exiting your application ! 
    } 
} 
+0

這些例子是好的和有用的,但沒有聽衆行爲。我想要得到jvm創建新線程的信息,讓我們在不重寫任何內容的情況下「不定式」地說。 –

+0

@ŁukaszRzeszotarski你可以從上面的例子中實現一個監聽器行爲,但它們是關於運行線程而不是創建線程的(如你所問)。 – user454322

1

也許一個ThreadGroup是你需要的。所有線程都是ThreadGroup的成員,並且當您啓動一個新線程時,它將默認添加到與其父項相同的組中。

從理論上講,當線程被添加或從組中移除時,可能(但不推薦)子類將被通知。

輪詢這些組的線程或輪詢所有線程很可能是更好的解決方案。

+0

線程在創建時或線程啓動時被添加到線程組中? –

+0

從代碼中可以看出它何時啓動。如果你想知道什麼時候創建一個線程,你需要子類Thread(並且改變所有創建線程的代碼) –