将java类方法添加到新线程中

时间:2016-07-14 10:18:08

标签: java multithreading

我有一个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()?

2 个答案:

答案 0 :(得分:2)

Runner。如果您使用的是Eclipse,则会有一个模板可以自动为您编写运行程序。此外,如果您使用的是Swing,则应该将所有内容都解决到Swing事件队列中。

如果你还没有这样做,你可能需要重新设计GUI,使其成为一个控制器而不是应用程序本身(好吧,大概是因为你在GUI中遇到这个线程问题) )。

相关文档

Runnable文档: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-

并发和SwingWorkerhttps://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

答案 1 :(得分:1)

使用 AtomicBoolean 表示两种方法之间的状态,并使用状态来读取或终止流。

import java.util.concurrent.atomic.AtomicBoolean;

public class CameraCapture {

    private AtomicBoolean doCapture = new AtomicBoolean();

    public Thread startCapture() {
        System.out.println("Setting Capture status to true");
        doCapture.set(true);


        Thread capture = new Thread(new Runnable() {
            public void run() {
                System.out.println("Initializing Sources");
               /* Initialization Code here. */
                System.out.println("Found WebCam!");

                System.out.println("Configuring Codec");

                while(doCapture.get()) {
                    System.out.println("\tReading Data!");
                    //Read and handle input.
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException exception) {
                        // FIXME:  minimum of logging.
                        exception.printStackTrace();
                    }
                }

                System.out.println("Capture Terminated!");

            }}, "CameraCapture Injest"); //Name the thread!

        System.out.println("Starting Capture");        
        capture.start();
        return capture;
    }

    public void stopCapture() {
        System.out.println("Disabling capture");
        doCapture.set(false);
    }
}

此测试应显示控制台中的工作流程。

@Test
    public void captureThreadTest() throws Exception {
        CameraCapture capture = new CameraCapture();
        Thread captureRunner = capture.startCapture();
        Thread.sleep(10000);

        capture.stopCapture();

        captureRunner.join();
    }
  

请注意,我从 startCapture soley返回 Thread 引用   出于单元测试示例的目的(因为我需要执行   获取最后一个输出的 join()。我不建议暴露   在生产代码中,因为它不提供良好的封装   和该线程状态的所有权。

Setting Capture status to true
Starting Capture
Initializing Sources
Found WebCam!
Configuring Codec
    Reading Data!
    Reading Data!
    Reading Data!
    Reading Data!
    Reading Data!
    Reading Data!
    Reading Data!
    Reading Data!
    Reading Data!
    Reading Data!
Disabling capture
Capture Terminated!