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调用的一部分。这是对的吗?
答案 0 :(得分:1)
是的,在初始化线程终止后,应继续调用handleGpioPinDigitalStateChangeEvent()
。
实际上,您不需要启动新线程来添加侦听器。只需将侦听器直接添加到按钮即可。另外一个线程对于做一些可能需要很长时间的事情很有用。但是,只需注册一个事件监听器就可以很快。
在handleGpioPinDigitalStateChangeEvent()
方法中,尝试打印线程的名称(Thread.currentThread().getName()
)。你可能会发现它是一个你没有自己开始的运行时线程。
答案 1 :(得分:0)
在Observable / Observer模式的最简单实现中,Observer向Observable注册自己的哪个线程并不重要,因为Observer将在导致事件的线程上获得回调通知在Observable中触发。