首页 > 解决方案 > 如何在 Java 中暂停和恢复线程?

问题描述

我正在创建一个打开笔记本电脑摄像头的程序,该程序处理Java中的线程,我试图暂停一个线程以允许另一个线程使用toggleButton执行,但我看到suspend()resume()的方法晦涩难懂,我想知道如何处理这些线程。

这是我的课程,它创建了第一个线程并允许我激活笔记本电脑上的摄像头

    

class Video extends Thread {

    boolean Running = true;

    @Override
    public void run() {

        while (this.Running) {
            Image image = webcam.getImage();
            jLabel1.setIcon(new ImageIcon(image));
            try {
                Thread.sleep(30);
            } catch (InterruptedException ex) {
                Logger.getLogger(WebCam.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void kill() {
        this.Running = false;
    }
}

这是我的另一个类,允许您更改图像颜色的类,我正在寻找的是能够暂停运行 Video 类的线程 1 并启动运行 VideoGray 类的线程 2

class VideoGray extends Thread {

    boolean Running = true;

    @Override
    public void run() {

        while (this.Running) {
            BufferedImage src = webcam.getImage();
            ColorConvertOp op
                    = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
            BufferedImage dest = op.filter(src, null);

            jLabel1.setIcon(new ImageIcon(dest));
            try {
                Thread.sleep(20);

            } catch (InterruptedException ex) {
                Logger.getLogger(WebCam.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void kill() {
        this.Running = false;
    }
}

这就是我在我的 ToggleButton 中的内容,vd 变量属于在 Video 之前创建的类,vdg 变量属于在主类开头创建的 VideoGray 类,vd 变量设置为在类开头运行main 这样当你运行程序时它就会启动,所以当我选择按钮时,我想暂停那个 vd 线程并使 vdg 线程运行。

private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                               
    // TODO add your handling code here:

    System.out.println(jToggleButton1.isSelected());

    if (jToggleButton1.isSelected()) {
            vd.suspend();
            vdg.resume();
    }



}                                              

标签: javamultithreadingnetbeans

解决方案


在您的线程中:

} catch (InterruptedException ex) {
    Logger.getLogger(WebCam.class.getName()).log(Level.SEVERE, null, ex);
    return; // This terminates thread execution.
}

在您的切换按钮操作中:

vd.interrupt();
vdg.start();

很好的教程:https ://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html


推荐阅读