2013-10-21 32 views
5

我是Java线程的新手。我想要做的是从ThreadB对象获取对当前正在运行的线程的实例ThreadA的访问,并调用其名为setSomething的方法。 1)我觉得我在做难度比它确实是 2)我有一个空指针异常,所以我必须在访问该方法如何从java中的另一个正在运行的线程访问方法

这里的时候,做错了什么是我到目前为止,我已经做了我因勤奋,并在这里看到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 
    } 

}

// assume this thread is started by another application 
public class ThreadB implements Runnable{ 

@Override 
public void run(){ 
    passAValue("New"); 
} 

public void passAValue(String status){ 
    // What I am trying to do is to get the instance of ThreadA and call 
    // its method setSomething but I am probably making it harder on myself 
    // not fully understanding threads 

    Method[] methods = null; 
    // get all current running threads and find the thread i want 
    Set<Thread> threadSet = Thread.getAllStackTraces().keySet(); 
    for(Thread t : threadSet){ 
    if(t.getName().equals("AThread")){ 
     methods = t.getClass().getMethods(); 
    } 

    } 

    //**How do I access ThreadA's method, setSomething** 

} 

}

预先感谢您

艾伦

+4

难道真的没有办法让你通过'ThreadA'对象_into_'ThreadB'这样你就可以直接访问它。对班级做一些反思是不合适的。 – Gray

+3

当你说“由另一个应用程序启动”时,你不是指在不同的JVM中,对吧?如果它在另一个JVM中,那么您将不得不使用RMI或其他进程间通信。或共享一个文件或其他东西。 – Gray

+0

格雷的第二个评论应该是被接受的答案! – 2013-10-21 17:09:54

回答

4

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

好吧,你需要做的就是将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 the setSomething() with this thread!! no thread a 
} 
} 

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

here简单threadtutorial

+1

我知道这个答案已经有一段时间了,但是我不得不说,当你在main()中实例化ThreadB时,你需要给出一个不是b的参数。只是指出.. –

1

在实例化您的ThreadB对象时或之后,给它一个对您的ThreadA对象实例的引用。喜欢的东西:

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

然后,ThreadB代码中,你可以使用你没有存储在ThreadB一个实例变量无疑是调用参考的ThreadA的方法。

+1

“//假设这个线程是由另一个应用程序启动的“!!! – 2013-10-21 17:08:40

相关问题