如何在Java中实现线程的可靠性

时间:2017-10-08 22:57:47

标签: java multithreading swing jframe jpanel

我正在使用Java Swing应用程序,在那里我有一个主框架和多个面板,我通过设置它们可见或不同时在它们之间通勤,同时,我实例化一个正在运行while循环的类背景。现在,问题是:除非while循环结束,否则面板不会出现,但我想让用户点击某些按钮,而while循环在后台继续,甚至他都不知道。以下是我的代码的一个小例子:

        startPage.setVisible(false);
        lblError.setVisible(false);     
        new QuestionPage(Integer.parseInt(fieldUserID.getText()));

QuestionPage有一个while循环,我希望不会冻结整个应用程序,直到完成,但是让while循环在后台运行。到目前为止,我尝试通过扩展Thread类来做2个线程,但我不确定这是否是正确的方法。

[编辑]

这是我使用SwingWorker后的NEXT按钮,以便在后台发送QuestionPage类中发生的while循环,并在主框架上进行摆动操作

btnStart.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {                
            if (validateInput(fieldUserID.getText(), fieldAge.getText(), fieldSex.getSelectedItem().toString(), fieldExperience.getText())) {   
                startPage.setVisible(false);
                lblError.setVisible(false); 
                SwingWorker worker = new SwingWorker<Void, String>() {
                    @Override
                    public Void doInBackground() {
                        new QuestionPage(Integer.parseInt(fieldUserID.getText()));
                        return null;
                        }                           
                    };                             
            } else {
                lblError.setVisible(true);
            }               
        };                  
    });

1 个答案:

答案 0 :(得分:0)

[ANSWER]

诀窍是使用SwingWorker在后台发送长时间运行的任务,并在其上调用execute()。以下是Start按钮事件侦听器的最小工作示例:

 // Send long running task in background
                SwingWorker worker = new SwingWorker<Void, String>() {
                    @Override
                    public Void doInBackground() {
                        new QuestionPage(Integer.parseInt(fieldUserID.getText()));
                        return null;
                        }                           
                    };
                    worker.execute();