如果线程已死(但进程仍然存在),是否会确认事件

时间:2016-04-11 17:56:31

标签: java multithreading

A类开始一个新线程,如下所示:

class A {
Thread t = new Thread(new B());
t.start();
}

B类在名为" myButton"的按钮上有一个事件处理程序。这实际上是一个GPIO引脚监控输入。

Class B implements Runnable() {

@Override
public void run() {
   myButton.addListener(new GpioPinListenerDigital() {
        @Override
        public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
            // display pin state on console
            System.out.println(" --> GPIO PIN STATE CHANGE: " + event.getPin() + " = " + event.getState());
        }

    });
}
System.out.println("Thread gets out here.....");
}

当在ClassA中调用t.start()时,ClassA中的线程(称之为threadA)等待新的spawn线程(称之为threadB)返回(因为threadB不是守护线程)。在ClassB中的run()方法内,事件被添加到myButton,而threadB得到了ClassB,最终ClassA中的threadA也结束了(因为线程B已经返回)。

问题:在完成上述所有操作(即线程A和B结束)后,myButton上发生了一个事件,即GPIO引脚收到输入,听众(myButton)是否会确认该事件或者它不会因为线程不活动而无法使用?我假设只要启动线程的进程处于活动状态,事件就会得到确认,即ClassA是servlet调用的一部分。这是对的吗?

2 个答案:

答案 0 :(得分:1)

是的,在初始化线程终止后,应继续调用handleGpioPinDigitalStateChangeEvent()

实际上,您不需要启动新线程来添加侦听器。只需将侦听器直接添加到按钮即可。另外一个线程对于做一些可能需要很长时间的事情很有用。但是,只需注册一个事件监听器就可以很快。

handleGpioPinDigitalStateChangeEvent()方法中,尝试打印线程的名称(Thread.currentThread().getName())。你可能会发现它是一个你没有自己开始的运行时线程。

答案 1 :(得分:0)

在Observable / Observer模式的最简单实现中,Observer向Observable注册自己的哪个线程并不重要,因为Observer将在导致事件的线程上获得回调通知在Observable中触发。