如何通过 jButton 单击启动和停止 netbeans 中的线程

How to start and stop a threads in netbeans from a jButton click

我编写 Java 桌面应用程序以从我的在线 rails 后端应用程序中获取和 post 一些数据。该应用程序必须每 5 秒调用一次获取请求以更新继电器状态(例如 Arduino)。这是我的代码:

public class GUI extends javax.swing.JFrame {

private Serial serial = null;
private Service service = null;
private volatile boolean connected = false;
private Thread updateThread;

public GUI() {
    initComponents();
    init_serial();
    service = new Service();
    updateThread = new Thread() {
        public void run() {
            while (connected) {
                updateJob();
            }
        }
    };
    updateThread.start();
}

private void init_serial() {
    serial = new Serial();
    serial.searchForPorts();
    serial.connect();
    serial.initIOStream();
    serial.initListener();
}

private void updateJob() {
    ActionListener actListner = new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent event) {
            updateState();
        }

    };
    Timer timer = new Timer(5000, actListner);
    timer.start();
}

private void updateState() {
    String portState = service.get_port_state();
    serial.write(portState);
    System.out.println(portState);
}


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    connected = true;
    logger.setText(null);
    logger.setText("connected");
}                                        

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    logger.setText(null);
    logger.setText("disconnected");
}                                        


public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new GUI().setVisible(true);

        }
    });
}

}

但它没有按预期工作,我的问题是如何修复我的代码以及如何正确放置线程?

您可以使用 thread.join();

您可以在 class 的成员中使用 Thread 对象,并且可以在按钮单击操作事件中启动和停止。这是 start/stop 线程的示例。

public class GUI extends javax.swing.JFrame {
    Thread updateThread = null;
    public GUI() {
        JButton btnStart = new JButton("Start");
        JButton btnStop = new JButton("Stop");
        JPanel jPanel = new JPanel();
        jPanel.setBounds(0, 0, 100, 200);
        jPanel.add(btnStart);
        jPanel.add(btnStop);
        add(jPanel);
        btnStart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                updateThread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (true) {
                            System.out.println("Work updated");
                            try {
                                Thread.sleep(1000);//Time to wait for next routine
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
                updateThread.start();
            }
        });
        btnStop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                updateThread.stop();

            }
        });
        setVisible(true);
        setBounds(0, 0, 100, 200);
    }

    public static void main(String[] args) {
        new GUI();
    }

}