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(); main personalThread run 里面分别加上这句话,看看打印出来的结果就能清晰的认识到了。 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 了哦!