Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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中的线程和观察者模式_Java_Multithreading_Observer Pattern - Fatal编程技术网

Java中的线程和观察者模式

Java中的线程和观察者模式,java,multithreading,observer-pattern,Java,Multithreading,Observer Pattern,假设我有两个类,Main类和Worker类 class Main implements StateChangeListener extends JFrmame{ public void notifyMe(State state){ //Change the GUI according to the state } } class Worker extends Thread{ public StateChangeListener listener;

假设我有两个类,Main类和Worker类

class Main implements StateChangeListener extends JFrmame{

   public void notifyMe(State state){
        //Change the GUI according to the state
   }  
}


class Worker extends Thread{
    public StateChangeListener listener;
    public void run(){
        listener.notifyMe(state);
    }
}
我的问题是: 假设工作线程在另一个线程中运行,哪个线程将运行函数notifyMe()

主线程还是辅助线程?感谢您运行辅助线程的同一线程。

函数调用是在调用它的线程的控制下执行的。在您的情况下,由于您是从工作线程调用notifyMe(),因此工作线程将负责执行方法notifyMe()


您可以使用
Thread.currentThread().getName()
打印线程的名称来测试这一点。请参阅getter/setter以获取位于的线程名称

。。。除非这个家伙从来没有启动过线程,只是调用了
run()
@Bear,你能给我们看一下你用来启动线程的代码吗?@MarkoTopolnik,它仍然是运行
Worker
的线程。我正在猜测为什么会这样问。如果Worker没有启动,那么可以说没有人在运行Worker(这取决于您所说的“运行Worker”的确切含义)。@MarkoTopolnik,是的,可能是,尽管OP中没有提到没有调用
notifyMe
。。。但是,当然,不完整或模糊的问题可能会出现,因此(少数,偶尔:-P)@Bear新线程在您调用
start
之前不会启动。类
Thread
本身只是一个句柄,而不是“Thread”。就像
文件
——如果您有一个
文件
对象,这并不意味着该文件实际上存在。当您调用
Thread.start
时,一个新线程启动并开始执行
run
方法——它与该线程的
main
方法类似。还要注意的是,
start
方法调用
run
——没有人调用
run
,就像没有人调用
main
一样。这是起点。可能是重复的