java - Swing 中的 Wait() 语句

标签 java multithreading swing

我有 2 个按钮。第一个启动线程,第二个让它等待。第一个按钮工作正常,但第二个按钮不想停止第一个按钮线程。怎么了?如何让它停止?

package SwingExp;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class WhichButton implements ActionListener {

    JLabel jLab, testLab = new JLabel();
    JFrame jfrm = new JFrame("Button example");
    JButton firstButton = new JButton("First"), secondButton = new JButton("Second");

    WhichButton() {


        jfrm.setLayout(new FlowLayout());
        jfrm.setSize(220, 90);

        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        firstButton.addActionListener(this);
        secondButton.addActionListener(this);
        jfrm.add(firstButton);
        jfrm.add(secondButton);

        jLab = new JLabel("Press button");
        jfrm.add(jLab);
        jfrm.add(testLab);

        jfrm.setVisible(true);
    }

    class SimpleThread extends Thread {
        Thread t;
        boolean suspendFlag;

        SimpleThread() {
            t = new Thread(this, "settingThread");
            t.start();

        }

        public void run() {


            for (int i = 0; i <= 10; i++) {
                synchronized (this) {
                    while (suspendFlag) {
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                        }
                    }
                }

                testLab.setText(Integer.toString(i));

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {

                }

            }

            firstButton.setEnabled(true);
            testLab.setText("Completed.");
        }

        synchronized void setSuspendFlag(boolean suspendFlag) {
            this.suspendFlag = suspendFlag;
        }


    }


    public void actionPerformed(ActionEvent e) {

        SimpleThread st = new SimpleThread();

        if (e.getActionCommand().equals("First")) {
            jLab.setText("First");
            firstButton.setEnabled(false);
            st.setSuspendFlag(false);

        } else {
            st.setSuspendFlag(true);
        }
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new WhichButton();
            }
        });
    }


}

我试图使用 interrupt() 方法,但它让我多了一个线程或类似的东西。

最佳答案

您需要在setSuspendFlag()方法中notify() hibernate 线程。否则,线程将永远阻塞在 wait() 调用中。

此外,每次按下按钮时,您都会创建一个新的 SimpleThread 实例。您需要将 SimpleThread 实例设为成员变量,并且只创建一次。

关于java - Swing 中的 Wait() 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19502748/

相关文章:

java - 在 GUI 中显示数组

java - 尝试从扫描仪读取时文件内容被删除

java - 2个字节数组的差异

Java 100个左右的并行线程,内存管理

python - 如何加快向量集之间余弦相似度的计算

python - Python中的多处理,每个进程处理一个文件的一部分

java - 如何使一个 JComponent 镜像另一个 JComponent?

java - java应用程序中的高CPU利用率-为什么?

java - CyclicBarrier 的可见性同步?

java - 使用 BoxLayout 作为垂直 FlowLayout 来容纳 JPanel