针对相关联的Job统一进行处理 有时我们需要对相关联的Job一起处理例如需要同时取消这些Job或者等待所有这些Job结束这时我们可以使用Job Family对于相关联的Job我们可以将它们设置成同一个Job Family我们需要重载Job的belongsTo方法以设置一个Job的Job Family
Private Object MY_JOB_FAMILY = new Object();
Job job = new Job(Job Name){
protected IStatus run(IProgressMonitor monitor) {
// 在这里添加你的任务代码
return StatusOK_STATUS;
}
public boolean belongsTo(Object family){
return MY_JOB_FAMILYequals(family);
}
};
我们可以使用JobManager的一系列方法针对Job Family进行操作
Job
getJobManager()
cancel(MY_JOB_FAMILY); //取消所有属于MY_JOB_FAMILY的所有Job
JobgetJobManager()join(MY_JOB_FAMILY); //等待属于MY_JOB_FAMILY的所有Job结束
JobgetJobManager()sleep(MY_JOB_FAMILY); //将所有属于MY_JOB_FAMILY的Job转入睡眠状态
JobgetJobManager()wakeup(MY_JOB_FAMILY); //将所有属于MY_JOB_FAMILY的Job唤醒
线程死锁的调试和解决技巧
一旦我们使用了线程我们的程序中就有可能有死锁的发生一旦发生死锁我们发生死锁的线程会没有响应导致我们程序性能下降如果我们的UI线程发生了死锁我们的程序会没有响应必须要重启程序所以在我们多线程程序开发中发现死锁的情况解决死锁问题对提高我们程序的稳定性和性能极为重要
如果我们发现程序运行异常(例如程序没有响应)我们首先要确定是否发生了死锁通过下面这些步骤我们可以确定是否死锁以及死锁的线程
在Eclipse中以Debug模式运行程序 执行响应的测试用例重现问题 在Eclipse的Debug View中选中主线程(Thread[main])选择菜单Run>Suspend这时Eclipse会展开主线程的函数调用栈我们就可以看到当前主线程正在执行的操作 通常Eclipse在等待用户的操作它的函数调用栈会和以下类似
图片示例
如果主线程发生死锁函数调用栈的最上层一般会是你自己的函数调用你可以查看一下你当前的函数调用以确定主线程在等待什么 使用同样的方法查看其他线程特别是那些等待UI线程的线程 我们需要找出当前线程相互的等待关系以便找出死锁的原因我们找出死锁的线程后就可以针对不同情况进行处理
减小锁的粒度增加并发性 调整资源请求的次序 将需要等待资源的任务放到独立的线程中执行
[] [] [] [] [] []