我有一个 java 类,它实际上从网络摄像头捕获帧。该类有两种方法,一种用于启动,一种用于停止。我想将此类添加到我创建的 gui 中。但是,当我按原样添加功能时,我的游戏就卡住了。看来我需要在这里做一些多线程。如何将我的类方法添加到新线程中?
编辑:我现在的代码如下:
Thread t2 = new Thread(new Runnable() {
public void run()
{
VideoCapture videoCapture = VideoCapture.create(VideoFormat.WMV);
List<VideoSource> availableVideoSources = VideoSource.getAvailable();
//System.out.println("availableVideoSources = " + availableVideoSources);
if (availableVideoSources.isEmpty()) {
throw new IllegalStateException("No external video sources available");
}
VideoSource webCamera = availableVideoSources.get(0);
//System.out.println("webCamera = " + webCamera);
videoCapture.setVideoSource(webCamera);
java.util.List<Codec> videoCodecs = videoCapture.getVideoCodecs();
//System.out.println("videoCodecs = " + videoCodecs);
if (videoCodecs.isEmpty()) {
throw new IllegalStateException("No video codecs available");
}
Codec videoCodec = videoCodecs.get(2);
//System.out.println("videoCodec = " + videoCodec);
EncodingParameters encodingParameters = new EncodingParameters(new File("file.wmv"));
encodingParameters.setBitrate(500000);
encodingParameters.setFramerate(10);
encodingParameters.setKeyFrameInterval(1);
encodingParameters.setCodec(videoCodec);
videoCapture.setEncodingParameters(encodingParameters);
videoCapture.start();
//System.in.read();
//videoCapture.stop();
}});
我正在通过调用 t2.start() 来运行该线程,如何在第二个函数中调用 videoCapture.stop()?
最佳答案
runner
。如果您使用的是 Eclipse,则有一个模板会自动为您编写运行程序。此外,如果您使用的是 Swing,则应该将所有内容都发送到 Swing 事件队列。
如果您还没有这样做,您可能需要重新设计 GUI,使其成为一个 Controller 而不是应用程序本身(好吧,大概是因为您在 GUI 中遇到了线程问题)。
相关文档
可运行
文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html
EventQueue.invokeLater(Runnable)
文档:http://docs.oracle.com/javase/8/docs/api/java/awt/EventQueue.html#invokeLater-java.lang.Runnable-
并发性和 SwingWorker
:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
关于java - 将 java 类方法添加到新线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38371582/