正如你所知道的,我是多线程的新手,有点卡在这里。对于我的程序,我需要一个线程(PchangeThread
在下面的示例中),它可以在程序执行期间的任何时候从另一个线程打开和关闭。线程应该在启动时暂停,并在pixelDetectorOn()
被调用时恢复。
这两个线程很可能不需要共享任何数据,除了开始/停止标志。无论如何,我还是包含了对主线程的引用,以防万一。
但是,在下面的代码中,唯一输出的消息是“进入循环之前”,这表明线程由于某种原因永远不会从 wait() 中唤醒。我猜这是某种锁定问题,但我无法弄清楚到底出了什么问题。this.detector
从主线程锁定给了我相同的结果。另外我想知道wait()
/notify()
范式是否真的是挂起和唤醒线程的方法。
public class PchangeThread extends Thread {
Automation _automation;
private volatile boolean threadInterrupted;
PchangeThread(Automation automation)
{
this._automation = automation;
this.threadInterrupted = true;
}
@Override
public void run()
{
while (true) {
synchronized (this) {
System.out.println("before entering loop");
while (threadInterrupted == true) {
try {
wait();
System.out.println("after wait");
} catch (InterruptedException ex) {
System.out.println("thread2: caught interrupt!");
}
}
}
process();
}
}
private void process()
{
System.out.println("thread is running!");
}
public boolean isThreadInterrupted()
{
return threadInterrupted;
}
public synchronized void resumeThread()
{
this.threadInterrupted = false;
notify();
}
}
resumeThread()
通过以下方式从主线程调用:
public synchronized void pixelDetectorOn(Context stateInformation) {
this.detector.resumeThread();
}
detector
是对 的实例的引用PchangeThread
。“检测器”线程通过以下方式在程序的主模块中实例化:
detector=new PchangeThread(this);