简体   繁体   中英

How to achieve thread concurency in Java

I am working with a Java Swing application, where I have a main frame and multiple panels which I commute between by setting them visible or not and in the same time, I am instantiating a class which is running a while loop in the background. Now, the problem is: the panels don't appear unless that while loop ends, but I would like to let the user click some buttons while the while loops continues in the background, without even him knowing about that. Here is a small example of my code:

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

QuestionPage has a while loop going, and I would like to not freeze the whole application until that is finished, but to let that while loop run in the background. So far I tried doing 2 threads by extending the Thread class, but I am not sure if this is the right way to do it.

[EDIT]

Here is my NEXT button after using a SwingWorker in order to send in background the while loop which happens in QuestionPage class and to carry on with swing operations on the main frame

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);
            }               
        };                  
    });

[ANSWER]

The trick is to use a SwingWorker to send the long running task in the background and to also call execute() on it. Here is a minimal working example for a Start button event listener:

 // 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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM