Eclipse中的UI线程
另外在Eclipse的线程处理中有一个UI线程的概念Eclipse程序中的主线程是一个特殊的线程程序启动后会先执行这个线程也就是我们的main()函数所在的线程作为桌面应用程序我们的主线程主要负责界面的响应以及绘制界面元素所以通常我们也叫它UI线程
以下代码编过SWT应用程序的读者会非常熟悉它一般出现在main函数的结尾下面来仔细分析一下它的详细情况
//当窗口未释放时
while (!shellisDisposed()) {
//如果display对象事件队列中没有了等待的事件就让该线程进入等待状态
if (!displayreadAndDispatch())
displaysleep();
}
上面的程序实际上就是我们UI线程的处理逻辑当程序启动后UI线程会读取事件等待队列看有没有事件等待处理如果有它会进行相应处理如果没有它会进入睡眠状态如果有新的事件到来它又会被唤醒进行处理UI线程所需要处理的事件包括用户的鼠标和键盘操作事件操作系统或程序中发出的绘制事件一般来说处理事件的过程也就是响应用户操作的过程
一个好的桌面应用程序需要对用户的操作作出最快的响应也就是说我们的UI线程必须尽快的处理各种事件从我们程序的角度来说在UI线程中我们不能进行大量的计算或者等待否则用户操作事件得不到及时的处理通常如果有大量的计算或者需要长时间等待(例如进行网络操作或者数据库操作)时我们必须将这些长时间处理的程序单独开辟出一个线程来执行这样虽然后台运行着程序但也不会影响界面上的操作
除主线程之外的所有线程都是非UI线程在Eclipse程序中我们所有对界面元素的操作都必须放到UI线程中来执行否则会抛出Exception所以我们要区分出UI线程和非UI线程保证我们对UI的操作都在UI线程中执行
如何判断当前线程是否UI线程: 你可以通过调用DisplaygetCurrent()来知道当前线程是否是UI线程如果DisplaygetCurrent()返回为空表示当前不是UI线程
Eclipse中使用线程的几种典型情况
控制Job的并发运行 对于某些Job为了避免并发性问题我们希望同时只有一个这样的Job在运行这时我们需要控制Job的并发运行在另一种情况下我们也需要控制Job的并发运行我们在程序中对于一个任务我们有可能会启动一个Job来执行对于少量的任务来说这是可行的但是如果我们预测可能会同时有大量的任务如果每一个任务启动一个Job我们同时启动的Job就会非常多这些Job会侵占大量的资源影响其他任务的执行我们可以使用Job的rule来实现控制Job的并发执行简单的我们可以通过下面的代码实现我们先定义一个如下rule
private ISchedulingRule Schedule_RULE = new ISchedulingRule() {
public boolean contains(ISchedulingRule rule) {
return thisequals(rule);
}
public boolean isConflicting(ISchedulingRule rule) {
return thisequals(rule);
}
};
对于需要避免同时运行的Job我们可以将它们的rule设成上面定义的rule如
myjob
setRule(Schedule_RULE);
myjobsetRule(Schedule_RULE);
[] [] [] [] [] []