代码之家  ›  专栏  ›  技术社区  ›  Kricket

为每个新线程执行代码?

  •  2
  • Kricket  · 技术社区  · 14 年前

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

    3 回复  |  直到 14 年前
        1
  •  6
  •   aioobe    14 年前

    不,不使用标准Java。

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

        2
  •  4
  •   assylias    14 年前

    并不是每次都创建一个新线程。但是,如果使用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();
    }
    
        3
  •  3
  •   Konrad Reiche    14 年前

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

    这可以用 ASM ,他们有一个 tutorial 开始或看一下指南 Add Logging at Class Load Time with Java Instrumentation ,他们解释了如何修改Java代码,即每次输入和退出方法时都会添加代码。

    在您的情况下,您只会对特殊方法执行此操作,或者 Thread() 构造函数或调用 Thread.start()