線程創建監聽器
回答
我認爲這將有可能與AOP(AspectJ的舉例)。但是仍然需要創建自己的Thread
和ThreadGroup
/Executor
類型,除非可以使用方面編譯器重新編譯JDK類。如果要註冊線程啓動或池的createThread
(如果要註冊創建線程對象),請在線程的start
方法上定義切入點。
只有當你重新編譯JDK與編譯器方面的以下工作: 所有線程都開始Thread.start
,所以寫了這個方法,那麼你可以使用建議做你想要什麼的切入點。當然這並不完美,因爲例如一個cachedThreadPool執行器可能不會爲每個任務啓動一個新線程,但是如果你在Runnable.run
和Callable.call
而不是Thread.start
上註冊一個切入點,那可能就足夠了。
這可能適用於運行線程,但問題是關於創建線程而不是線程正在運行的線程。 – user454322
@ user454322編號A在線程啓動時,建議將被調用。 (即這三種方法中的任何一種被調用) – zeller
我知道它將在線程_are started_之前被調用,但會在線程_re created_時被調用? 例如,如果線程是_created_但從未_started_會發生什麼? – user454322
我會創建一個線程,不斷列出JVM上所有正在運行的線程。
然後,每次它不確定一個新線程出現時,它會以任何方式通知您的代碼中的一個類。
下面是關於如何列出所有線程當前運行在JVM上的一些鏈接:
========= ===
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 !
}
}
這些例子是好的和有用的,但沒有聽衆行爲。我想要得到jvm創建新線程的信息,讓我們在不重寫任何內容的情況下「不定式」地說。 –
@ŁukaszRzeszotarski你可以從上面的例子中實現一個監聽器行爲,但它們是關於運行線程而不是創建線程的(如你所問)。 – user454322
也許一個ThreadGroup是你需要的。所有線程都是ThreadGroup的成員,並且當您啓動一個新線程時,它將默認添加到與其父項相同的組中。
從理論上講,當線程被添加或從組中移除時,可能(但不推薦)子類將被通知。
輪詢這些組的線程或輪詢所有線程很可能是更好的解決方案。
線程在創建時或線程啓動時被添加到線程組中? –
從代碼中可以看出它何時啓動。如果你想知道什麼時候創建一個線程,你需要子類Thread(並且改變所有創建線程的代碼) –
- 1. 線程監聽器通知
- 2. 線程輸出監聽器
- 3. 無線監聽器
- 4. 創建監聽QLabel
- 5. 監視線程創建
- 6. Android多線程與事件監聽器
- 7. 覆蓋監聽器和線程
- 8. Swing Window監聽器線程問題
- 9. 線程結束監聽器。 Java
- 10. WebSphere MQ消息監聽器線程
- 11. 另一個線程的監聽器
- 12. Jboss as7監測HTTP偵聽器線程
- 13. 動態創建項目的監聽器
- 14. 爲Siri創建一個監聽器
- 15. Oracle監聽器創建登錄
- 16. Java:創建* any *類時的監聽器?
- 17. 在Java EE中創建Netty監聽器
- 18. JavaScript - 動態創建事件監聽器
- 19. GMainLoop和TCP監聽線程
- 20. RxJava2從監聽器創建Flowable並在最後刪除監聽器
- 21. Android監聽器中斷監聽器
- 22. 創建事件監聽器,監聽變量中的值是否已更改
- 23. 監聽音頻線
- 24. 監聽器教程 - Android Eclipse
- 25. 遠程插座監聽器
- 26. Python單線無聲插座監聽器
- 27. 線路監聽器事件丟失
- 28. Laravel監聽器監聽多個事件
- 29. TCP監聽器停止監聽
- 30. chrome.webRequest.onAuthRequired監聽器
如果你在主線程中註冊了一個'ClassLoader',希望這將會被所有新線程繼承,並且希望任何線程都需要加載一些類,這意味着你的'ClassLoader'將會被查詢,並且你有一個機會來註冊線程.... – Saintali
我會通過擴展'線程'的方式爲聽衆所需的方法。當然,只能用於你的代碼。 – SJuan76
您是否需要跟蹤轉換(例如:「現在創建了一個新的線程,我必須立即對它做出反應」),還是足以讓您的應用程序創建一個或多個線程列表特定的時間點(比如:「現在我想知道線程並對它們做些什麼。」)? – Fildor