java - 如何通过 GUI 按钮停止线程?

标签 java multithreading user-interface

我想知道如何从GUI停止线程。我想如果线程是在按钮创建之前创建的,我会没事的,但我也尝试放入 JProgressBar 以便我可以更新它。所以现在我对如何做到这一点感到困惑。如果你能帮忙那就太好了。

提前致谢!

代码:

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import javax.swing.JOptionPane;

public class mainJFrame extends javax.swing.JFrame {

    //set Global variables
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    final int screenH = dim.height, screenW = dim.width;
    private volatile boolean isStop = true;

    public mainJFrame() {
        initComponents();
    }

    @SuppressWarnings("unchecked")                          
    private void initComponents() {

        jProgressBar1 = new javax.swing.JProgressBar();
        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Zeveso's MD5 Cracker");
        setBounds(new java.awt.Rectangle(200, 200, 0, 0));
        setResizable(false);

        jLabel1.setText("MD5:");

        jButton1.setText("Start");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Stop");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jMenu1.setText("File");

        jMenuItem1.setText("Create MD5");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem1);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(18, 18, 18)
                        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton1)
                        .addGap(18, 18, 18)
                        .addComponent(jButton2)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 29, Short.MAX_VALUE)
                .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }                    

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if(isStop == true){
        jProgressBar1.setIndeterminate(true);
        myMDThread.start();
        isStop = false;
        }
        else{
            System.out.println("Already running!");
        }
    }                                        

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        createMD5 myMD = new createMD5();
        String myPass = JOptionPane.showInputDialog(null, "Please put your password!");
        myPass = myMD.getMD5(myPass);
        JOptionPane.showMessageDialog(null, "MD5: " + myPass);
        System.out.println(myPass);
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        StringSelection stringSelection = new StringSelection(myPass);
        clipboard.setContents(stringSelection, null);
    }                                          

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        jProgressBar1.setIndeterminate(false);
        isStop = true;
    }                                        


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new mainJFrame().setVisible(true);
            }
        });
    }                  
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JProgressBar jProgressBar1;
    private javax.swing.JTextField jTextField1;                
}

最佳答案

没有安全的方法来强制停止线程(请阅读有关 Thread.stop() 方法的 JavaDoc 以获取更多说明)。

最好的方法是调用interrupt方法,这是一种“协作”停止。如果线程正在进行可中断调用,那么它将抛出 InterruptedException。如果线程是计算密集型的,那么它应该定期使用 Thread.interrupted() 检查自己的中断状态,并在请求时干净地退出。

关于java - 如何通过 GUI 按钮停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486139/

相关文章:

Java -- JDialog 不可移动

c# - 以编程方式添加 DeskBand 时出错

java - 从另一个项目中的 AsyncTask 的 onPostExecute() 更新 UI 小部件

c++ - 在 C++ 类中运行线程

multithreading - 带有异步 block 的串行调度队列

ios - 创建 Waves 可视化歌曲 Swift

objective-c - UIProgressView : modify height for track line

java - 如何在java中为每个请求使用JSON Web Token (JWT)?

java - 滚动垂直像素列上的所有颜色组合

java - 如何检测/避免 Java 中的自动装箱?