J2se程序在运行时,会默认的启动两个线程,当然这两个线程都是有JVM生成,一个是JVM垃圾回收的线程,这个我们可以不管它;另一个是运行入口函数mian的线程。如果你写的是GUI程序的话,主线程也就是main线程通常情况下有用来产生界面的,在这种情况下,如果你点击某个按钮执行的程序要花费很长时间的话,那程序界面就假死了。因此我们需要认为的来给程序创建一个额外的线程来操作长时间执行的代码。下面讨论下如何创建额外的线程。
java中创建线程有两个方式:
1. 继承Thread
2. 实现Runnable接口
我们用第二种方式:
public class personalThread implements Runnable {
        public void run() {
               函数体
}
}
上面的personalThread类因为事项了Runnable接口,因此它是一个线程类,那我们如何来启动这个线程呢?如下:
new Thread(personalThread).start(); 这样就成功的启动了一个线程。如何来确认我们的线程创建成功了呢?通过:Thread.currentThread.getName();mainpersonalThreadrun里面分别加上这句话,看看打印出来的结果就能清晰的认识到了。Main里面打印出来的应该是main,而personalThread里面打印出来的应该是Thread-0.
 
上面讨论了java中如何创建线程,但是在swt中如果你想在非UI线程中调用UI线程里面的widgets的话,就要用到了asyncExec方法。这么处理的原因是为了swt处于线程安全性的考虑。下面来看看swt中非UI线程调用UI线程中widgets的方法。
Swt中如果非UI线程想调用UI线程中的widgets,有以下的三个方式:
asyncExec(Runnable runnable):异步启动新的线程。所谓异步就是,UI线程不会等待runnable对象执行结束后再继续进行,就是说UI线程可以和runnable对象所在的线程同时运行。
  syncExec(Runnable runnable):同步启动新的线程。所谓同步就是,UI线程会等待runnable对象执行结束后才会继续进行,当runnable对象是耗时大的线程时,尽量不要采用此种方式。另外,对于该种方式创建的线程可通过getSyncThread()方法获得线程对象。
  timerExec(int milliseconds,Runnable runnable):指定一段时间再启动新的线程。用此方法创建的线程,将会在指定的时间后再启动线程。当然用此方法创建的线程启动后,与UI线程是异步的。如果指定的时间为负数,将不会按时启动线程。
我们写个例子:假设UI线程有个Text对象messageText
public class personalThread implements Runnable {
        public void run() {
               messageText.append(“在创建的线程中更新”);
}
}
这时会报个异常:org.eclipse.swt.SWTException: Invalid thread access。这就是swt在线程方面做得安全性考虑,如果将代码改为:
messageText.getDisplay. asyncExec(new Runnable() {
    messageText.append(“在创建的线程中更新”);
})
这时就ok了哦!