获取从运行runnable的线程创建runnable的方法

时间:2015-03-05 02:03:47

标签: java methods

假设我有一个自定义Thread类,负责运行runnables

public class MyThread extends Thread{
    public MyThread(Runnable r) {
        super(r);
    }

    @Override
    public void run() {
        super.run(); // Can I put something here to get info about where the runnable is submitted from?
    }
}

然后在某种方法中,我提交了runnable

public void someMethod() {
    new MyThread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Blah");
        }
    });
}

假设我无法控制someMethod,我是否可以修改MyThread,以便每当将runnable提交给MyThread时,我都可以获得有关someMethod的信息(例如方法)名称someMethod,班级名称??

修改

事实上,原始问题是我问题的一部分。

我提供了一个可由线程池(ExecutorService)使用的ThreadFactory

public class MyThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        return new MyThread(r);
    }
}

用户可以使用MyThreadFactory

创建一个线程池

ExecutorService pool = Executors.newCachedThreadPool(new MyThreadFactory());

通过调用pool.execute(runnable),将创建一个MyThread实例来执行runnable指定的任务。线程可能会被多个runnables重用。因此,我想在Method Class方法中检索public void run()MyThread信息。由于runnable存储在基本Thread类的私有字段中,因此我无法使用 Laerte 提供的解决方案的修改版本,如:

@Override
public void run() {
    super.run(); 
    // Not working, Since MyThread cannot access private field target of Thread class
    Method m = target.getClass().getEnclosingMethod();
    System.out.println(m.toString());
}

在调用Method时,我是否仍然可以获取Classpublic void run()关于runnable实例化的位置?

1 个答案:

答案 0 :(得分:1)

要了解与调用方法,类名等相关的事项,您应该使用反射

在您的情况下,您应该像这样修改您的代码。

class MyThread extends Thread{
    public MyThread(Runnable r) {
        super(r);
        Method m = r.getClass().getEnclosingMethod();
        System.out.println(m.toString());
    }

    @Override
    public void run() {
        super.run(); 
    }
}

Method类将具有方法引用。使用此调用Method m = r.getClass().getEnclosingMethod();,您将收到包含Runnable对象的方法。在你的情况下,oneMethod。

这个想法。告诉我它是否有帮助。