Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从运行runnable的线程获取创建runnable的方法_Java_Methods - Fatal编程技术网

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

Java 从运行runnable的线程获取创建runnable的方法,java,methods,Java,Methods,假设我有一个定制的Thread类,负责运行Runnable 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

假设我有一个定制的
Thread
类,负责运行Runnable

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
,以便每当向
MyThread
提交runnable时,我都可以获得有关
someMethod
的信息(例如,方法名
someMethod
,类名)

编辑

事实上,最初的问题是我问题的一部分

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

用户可以使用
MyThreadFactory

ExecutorService pool=Executors.newCachedThreadPool(newmythreadfactory())

通过调用pool.execute(runnable),将创建MyThread的实例来执行runnable指定的任务。线程可能会被多个可运行程序重用。因此,我想在
public void run()
Method
MyThread
中检索
Method
Class
信息。由于
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());
}

在调用
public void run()
的那一刻,我还可以获得
Method
Class
关于runnable实例化在哪里的信息吗?

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

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

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(); 
    }
}
方法类将具有方法引用。使用此调用
方法m=r.getClass().getEnclosuringMethod(),您将收到包含可运行对象的方法。在你的情况下,一种方法


这就是我的想法。如果有帮助,请告诉我。

您希望收到什么样的信息?已编辑,感谢您指出您有完整的代码吗?还有一件事。您是否尝试了
方法m=this.getClass().getEnclosuringMethod()?在
ThreadFactory的
newThread
MyThread
的构造函数中,
方法m=this.getClass().getEnclosuringMethod()工作完美:)对我来说,一个困难是我无法访问
someMethod
,因此我无法将代码放入该方法中。我希望从
MyThread
获得方法名和类。我不知道这是否可能?我明白。。。因此,您可以使用相同的原理仅从MyThread访问此类方法。我编辑了代码,看看这是不是你要找的。嗯。。很抱歉没有提供我的情况的全貌。事实上,我提供了一个ThreadFactory,可供threadpool(ExecutorService)使用。通过调用
threadpool.execute(runnable)
,将创建
MyThread
的实例以执行runnable指定的任务。线程可能会被多个可运行程序重用。因此,我想在
public void run()
Method
MyThread
中检索
Method
Class
信息。我将用代码示例更新我的问题。是的,你的解决方案解决了我最初的问题嗯,我明白。。。我会想办法的。要使用的技术应该是这样的。我回家后再看看。这是一个非常有趣的问题!当做
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(); 
    }
}