Сейчас пытаюсь разобраться с мультипоточностью в свинге.
К примеру есть окно в котором располагается кнопка, по нажатию на которую выполняется какое-то длительное действие-А. Для того что бы GUI не подвисал решил запустить то самое действие-А в новом потоке.
Выглядит это следующим образом:
Кодpackage swing.aug17_2;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class SwingApp2 {
private JFrame frame;
private JButton btn;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run(){
try {
SwingApp2 app = new SwingApp2();
app.frame.setVisible(true);
} catch (Exception e){
e.printStackTrace();
}
}
});
}
public SwingApp2(){
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setTitle("Hello Swing");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setPreferredSize(new Dimension(300, 80));
frame.setSize(300, 80);
frame.setLocationRelativeTo(null);
frame.setIconImage(Toolkit.getDefaultToolkit().getImage(SwingApp2.class.getResource("/icon.png")));
frame.getContentPane().setLayout(new BorderLayout());
btn = new JButton("PUSH");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread thr = new Thread(){
@Override
public void run(){
try {
Thread.sleep(2000);
System.out.println("Done");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thr.start();
}
});
frame.add(btn, BorderLayout.CENTER);
}
}
Возникают сомнение на счёт вызова действия-А в новом потоке. Правильно ли вызывать таким способом? Если же нет - посоветуйте верный способ.
Спасибо.