本文分析了Eclipse中多线程程序的实现讨论了在Eclipse客户端程序开发中应用多线程的方法和要注意的问题同时也讨论了多线程程序的一些调试和问题解决的方法
Eclipse作为一个开发平台使用越来越广泛基于Eclipse Rich Client Platform开发的客户端程序也越来越多在当今越来越复杂的应用环境中我们的客户端程序不可避免的要同时进行多任务的处理一个优异的客户端程序都会允许用户同时启动多个任务从而大大提高用户的工作效率以及用户体验本文中我们来谈谈Eclipse中实现多任务的方式
在我们基于Eclipse的Java程序中我们有很多种方式提供多任务的实现熟悉Java的朋友立即会想到Java的Thread类这是Java中使用最多的一个实现多任务的类Eclipse平台为多任务处理提供了自己的API那就是Job以及UIJobEclipse中的Job是对Java Thread的一个封装为我们实现多任务提供了更方便的接口以下是Job的基本用法
清单 Job用法示例
Job job = new Job(
Job Name
){
protected IStatus run(IProgressMonitor monitor) {
// 在这里添加你的任务代码
return StatusOK_STATUS;
}
};
jobschedule(delayTime);
在Eclipse中我们也会经常用到DisplayasynchExec() 和DisplaysynchExec()来启动任务的执行这两个方法主要为了方便我们完成界面操作的任务以下是DisplayasynchExec()的用法DisplaysynchExec()和它类似
清单 DisplaysynchExec()用法示例
Display
getDefault()
asyncExec(new Runnable() {
public void run() {
// 在这里添加你的任务代码
}
});
通常在Eclipse中我们最好使用Eclipse提供的Job接口来实现多任务而不是使用Java的thread为什么呢?主要有以下几个原因
Job是可重用的工作单元一个Job我们可以很方便的让它多次执行 Job提供了方便的接口使得我们在处理中能够很方便的与外界交流报告当前的执行进度 Eclipse提供了相应的机制使得程序员可以方便的介入Job的调度例如我们可以方便的实现每次只有一个同一类型的Job在运行 Eclipse缺省提供了Job管理的程序可以查看当前所有的Job和它们的进度也提供UI终止暂停继续指定的Job 使用Job可以提高程序的性能节省线程创建和销毁的开销Eclipse中的Job封装了线程池的实现当我们启动一个Job时Eclipse不会马上新建一个Thread它会在它的线程池中寻找是否有空闲的线程如果有空闲线程就会直接用空闲线程运行你的Job一个Job终止时它所对应的线程也不会立即终止它会被返回到线程池中以备重复利用这样我们可以节省创建和销毁线程的开销 下面我们从几个方面来讨论Eclipse中Job的实现和使用方面的问题
Eclipse中Job的实现
Eclipse的核心包中提供了一个JobManager类它实现了IJobManager接口Eclipse中Job的管理和调度都是由JobManager来实现的 JobManager维护有一个线程池用来运行Job当我们调用Job的schedule方法后这个Job会被JobManager首先放到一个Job运行的等待队列中去之后JobManager会通知线程池有新的Job加入了运行等待队列线程池会找出一个空闲的线程来运行Job如果没有空闲线程线程池会创建一个新的线程来运行Job一旦Job运行完毕运行Job的线程会返回到线程池中以备下次使用从上面Job运行的过程我们可以看到JobManager介入了一个Job运行的全过程它了解Job什么时候开始什么时候结束每一时候Job的运行状态JobManager将这些Job运行的信息以接口的方式提供给用户同时它也提供了接口让我们可以介入Job的调度等从而我们拥有了更加强大的控制Job的能力
为了我们更方便的了解Job所处的状态JobManager设置Job的一个状态标志位我们可以通过Job的getState方法获得Job当前的状态值以了解其状态
NONE当一个Job刚构造的时候Job就会处于这种状态当一个Job执行完毕(包括被取消)后Job的状态也会变回这种状态 WAITING:当我们调用了Job的shedule方法JobManager会将Job放入等待运行的Job队列这时Job的状态为WAITING RUNNING:当一个Job开始执行Job的状态会变为RUNNING SLEEPING:当我们调用Job的sleep方法后Job会变成这一状态当我们调用schudule方法的时候带上延时的参数Job的状态也会转入这一状态在这一段延时等待的时间中Job都处于这一状态这是一种睡眠状态Job在这种状态中时不能马上转入运行我们可以调用Job的wakeup方法来将Job唤醒这样Job又会转入WAITING状态等待运行
[] [] [] [] [] []