为每个新线程执行代码?

时间:2012-07-25 08:29:40

标签: java multithreading

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

3 个答案:

答案 0 :(得分:6)

不,不使用标准Java。

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

答案 1 :(得分: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();
}

答案 2 :(得分:3)

这取决于您的用例,但您也可以使用Java字节code instrumentation。但是,这通常用于测量,错误跟踪,分析等,因为它会对性能产生显着影响。

这可以使用ASM来完成,他们有一个tutorial来开始或者查看指南Add Logging at Class Load Time with Java Instrumentation,他们解释了如何以某种方式修改Java代码,每次进入和退出方法时都会添加该代码。

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