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
了哦!
转载于:https://blog.51cto.com/shane/224288