SWT Jface Eclipse Java

/******************************************************************************
 * Copyright (c) 1998, 2004 Jackwind Li Guojie
 * All right reserved. 
 * 
 * Created on Oct 26, 2003 2:45:03 PM by JACK
 * $Id: SyncExecExample.java,v 1.1 2003/12/22 12:07:54 jackwind Exp $
 * 
 * visit: http://www.asprise.com/swt
 *****************************************************************************/
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
 * syncExec Example. 
 */
public class SyncExecExample {
  public static void main(String[] args) {
    final Display display = new Display();
    Shell shell = new Shell(display);
    
    final Runnable print = new Runnable() {
      public void run() {
        System.out.println("Print from thread: \t" + Thread.currentThread().getName());
      }
    };
    
    final Thread applicationThread = new Thread("applicationThread") {
      public void run() {
        System.out.println("Hello from thread: \t" + Thread.currentThread().getName());
        display.syncExec(print);
        System.out.println("Bye from thread: \t" + Thread.currentThread().getName());
      }
    };
    
    shell.setText("syncExec Example");
    shell.setSize(300, 100);
    
    Button button = new Button(shell, SWT.CENTER);
    button.setText("Click to start");
    button.setBounds(shell.getClientArea());
    button.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
      }
      public void widgetSelected(SelectionEvent e) {
        applicationThread.start();
      }
    });
    
    shell.open();    
    
    
    while(! shell.isDisposed()) {
      if(! display.readAndDispatch()) {// If no more entries in event queue
        display.sleep();
      }
    }
    
    display.dispose();
  
  }
}