import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class ThreadTest extends JFrame { private JButton b = new JButton("Blocking button..."); private JButton nb = new JButton("Non-Blocking button..."); private JTextField f = new JTextField(); public ThreadTest() { // TODO Auto-generated constructor stub } protected void initComponents() throws Exception { setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout(10,10)); getContentPane().add(b, BorderLayout.NORTH); getContentPane().add(nb, BorderLayout.SOUTH); getContentPane().add(f, BorderLayout.CENTER); b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.setText("Start..."); f.repaint(); try { // Blocking external IO for (int i = 0; i < 10; i++) { f.setText("... " + i + " ..."); Thread.sleep(1000l); } f.setText("...done."); } catch (Exception ex) { ex.printStackTrace(); } } }); nb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f.setText("Start..."); f.repaint(); new Thread(new Runnable() { @Override public void run() { try { // Blocking external IO for (int i = 0; i < 10; i++) { f.setText("... " + i + " ..."); f.repaint(); Thread.sleep(1000l); } f.setText("...done."); f.repaint(); } catch (Exception ex) { ex.printStackTrace(); } } }).start(); } }); pack(); } /** * @param args */ public static void main(String[] args) throws Exception { ThreadTest t = new ThreadTest(); t.initComponents(); t.setVisible(true); } }