线程创建监听器
回答
我认为这将有可能与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. http内部监听器线程
- 7. 线程结束监听器。 Java
- 8. WebSphere MQ消息监听器线程
- 9. Android多线程与事件监听器
- 10. 动态创建项目的监听器
- 11. Oracle监听器创建登录
- 12. 在Java EE中创建Netty监听器
- 13. RxJava2从监听器创建Flowable并在最后删除监听器
- 14. 创建事件监听器,监听变量中的值是否已更改
- 15. 监听音频线
- 16. 远程插座监听器
- 17. Python单线无声插座监听器
- 18. 线路监听器事件丢失
- 19. TCP监听器停止监听
- 20. Laravel监听器监听多个事件
- 21. CommunicationState监听器?
- 22. FacesMessage监听器
- 23. Android:ListView监听器?
- 24. chrome.webRequest.onAuthRequired监听器
- 25. 监听在一个单独的线程
- 26. 完全暂停线程监听用Java
- 27. 如何监听当前线程更改?
- 28. 器件监听器
- 29. Android创建接口监听器onClick在适配器
- 30. 为服务器套接字响应创建监听器?
如果你在主线程中注册了一个'ClassLoader',希望这将会被所有新线程继承,并且希望任何线程都需要加载一些类,这意味着你的'ClassLoader'将会被查询,并且你有一个机会来注册线程.... – Saintali
我会通过扩展'线程'的方式为听众所需的方法。当然,只能用于你的代码。 – SJuan76
您是否需要跟踪转换(例如:“现在创建了一个新的线程,我必须立即对它做出反应”),还是足以让您的应用程序创建一个或多个线程列表特定的时间点(比如:“现在我想知道线程并对它们做些什么。”)? – Fildor