如何在java中从另一个正在运行的线程访问方法

如何在java中从另一个正在运行的线程访问方法,java,multithreading,Java,Multithreading,我不熟悉Java线程。我试图做的是从ThreadB对象获得对当前运行线程ThreadA实例的访问权,并调用其方法setSomething。 1) 我想我让事情变得更难了 2) 我有一个空指针异常,所以在访问该方法时一定是做错了什么 这是我到目前为止所做的,我已经做了我的尽职调查,并在这里查看了StackOverflow的类似问题 我有一个当前线程在后台运行: // assume this thread is called by some other application public clas

我不熟悉Java线程。我试图做的是从ThreadB对象获得对当前运行线程ThreadA实例的访问权,并调用其方法setSomething。 1) 我想我让事情变得更难了 2) 我有一个空指针异常,所以在访问该方法时一定是做错了什么

这是我到目前为止所做的,我已经做了我的尽职调查,并在这里查看了StackOverflow的类似问题

我有一个当前线程在后台运行:

// assume this thread is called by some other application
public class ThreadA implements Runnable{

  private Thread aThread;

  public ThreadA(){
    aThread = new Thread(this);
    aThread.setName("AThread");
    aThread.start();
  }


  @Override
  public void run(){
     while(true){
       // doing something
     }
  }

  public void setSomething(String status){
    // process something
  }
}

//假设此线程由另一个应用程序启动
公共类ThreadB实现可运行{
@凌驾
公开募捐{
价值(“新”);
}
公共值(字符串状态){
//我试图做的是获取ThreadA的实例并调用
//它的方法设置了一些东西,但我可能使自己更难
//不完全理解线程
方法[]方法=null;
//获取所有当前正在运行的线程并找到我想要的线程
Set threadSet=Thread.getAllStackTraces().keySet();
用于(螺纹t:螺纹组){
if(t.getName().equals(“AThread”)){
方法=t.getClass().getMethods();
}
}
//**如何访问ThreadA的方法setSomething**
}
}

先谢谢你


Allen

在实例化ThreadB对象时或之后,为其提供对ThreadA对象实例的引用。比如:

ThreadA a = new ThreadA();
ThreadB b = new ThreadB(a);

然后,在ThreadB代码中,您可以使用ThreadB中实例变量中毫无疑问存储的引用来调用ThreadA的方法。

哇,为什么要把事情弄得这么复杂?!这并不像你想象的那么难(在黑暗的城堡里杀死一条龙!)

好的,您只需要将threadA引用传递给threadB!就这个。我要说的是,当你从线程b调用一个方法时,它是由线程b运行的,而不是由类托管的

class ThreadA implements Runnable {
    public void run() {
        //do something
    }

    public void setSomething() { }
}

class ThreadB implements Runnable {
    private ThreadA aref;

    public ThreadB(ThreadA ref) { aref = ref; }

    public void run() {
        aref.setSomething(); // Calling setSomething() with this thread! (not thread a)
    }
}

class Foo {
    public static void main(String...arg) {
        ThreadA a = new ThreadA();
        new Thread(a).start();

        ThreadB b = new ThreadB(a);
        new Thread(b).start();
    }
}

一个简单的threadtutorial

实际上没有办法将
ThreadA
对象传递到
ThreadB
中,这样您就可以直接访问它了。从类中进行一些反射不是最优的。当你说“由另一个应用程序启动”时,你的意思不是在不同的JVM中,对吗?如果它位于另一个JVM中,则必须使用RMI或其他进程间通信。或者共享一个文件什么的。格雷的第二条评论应该是公认的答案!“我对X是新手,我用反思来做。”——这几乎总是注定要失败的。反思只适用于那些知道如何在大多数情况下避免反思的人,也适用于那些无法避免反思的情况。感谢格雷的快速回复。两个线程将位于同一个JVM中。基本上,工作流是ThreadB,它将执行一些业务逻辑,并基于该逻辑,它将向ThreadA传递一些“状态”,以显示基于该状态的图像(即状态可以是new、delete、update)。我知道这个答案已经过了一段时间,但我必须说,当您在main()中实例化ThreadB时,您需要将a作为参数,而不是b。只是指出。。
class ThreadA implements Runnable {
    public void run() {
        //do something
    }

    public void setSomething() { }
}

class ThreadB implements Runnable {
    private ThreadA aref;

    public ThreadB(ThreadA ref) { aref = ref; }

    public void run() {
        aref.setSomething(); // Calling setSomething() with this thread! (not thread a)
    }
}

class Foo {
    public static void main(String...arg) {
        ThreadA a = new ThreadA();
        new Thread(a).start();

        ThreadB b = new ThreadB(a);
        new Thread(b).start();
    }
}