我正在开发一种简单的防盗java应用程序作为大学项目。它通过相机记录场景,并通过像素差异来检测场景中何时发生许多变化(您可以在此处看到完整的来源:https://github.com/lmammino/movementDetector)。我使用opencv-java绑定来处理需要对图像执行的各种操作
我有一些问题,因为我希望用户通过使用主用户界面中的一些按钮来启动/停止/重新启动视频捕获过程
为了捕获视频流,我使用javaopencv提供的类CanvasFrame
和OpenCVFrameGrabber
。我开发了一个名为Detector
的Runnable
类(完整来源:http://bit.ly/l1Z3tY)
Detector
类通过调用其启动方法自动运行自己的新线程
public void start()
{
if (this.thread == null)
this.thread = new Thread(this);
this.isThreadActive = true;
this.thread.start();
}
第一次从Detector
实例调用start方法时,一切都很好。当我尝试停止并重新启动进程时,它会给出无效线程状态异常。。。
所以我认为这里的全部问题是:"启动/停止/重新启动线程的最佳方式是什么?"
TNX
您正在停止/重新启动的对象实际上是Runnable,还是Thread?如果我没有记错的话,一个线程只能运行一次。如果你想多次运行它,你需要多次运行Runnable,而不是Thread。
来自线程文档:It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.