@HUST-SuWB
2015-02-01T08:13:23.000000Z
字数 1072
阅读 434
项目实战
关于多线程,网络上给出的原理都很简单,无非就是继承thread类或者是实现runable接口,但是我第一次处理的时候会有一些理解上的困难,比如程序怎样补充待处理的任务,以及怎么进入多线程的具体执行等。
当然,由于我是在一个师兄的基础上实现,因此很多架构上的问题已经不需要考虑了,有了底层的基础后,开发上层的多线程代码还是比较方便的。由于我也不是很懂,只能简单讲解一下思路,大家一起讨论。
首先,解决多线程任务的来源问题:
List<Task> tasks = dao.query("select task from Task task where task.taskType = 'type' and task.finishTime is null ");
for (Task task : tasks) {
executor.addTask(task);
}
这里的解决方式是建一张表,把所有待处理的任务全部读进去,程序执行的时候再从表里读出来(任务执行完之后finishTime会有值,所以待处理的任务与处理过的任务的区别就在finishTime是否为空上)
这里的executor.addTask(task)就会把所有的待处理任务加到线程池java.util.concurrent.ThreadPoolExecutor中。
然后就是具体的程序执行过程了。
public void run() {
try {
//如果已经被取消执行,则不执行
if (cancelled) {
return;
}
//如果即将执行时,该任务已经完成,则不执行
hibernateBaseDao.refresh(task);
if (task.getFinishTime() != null) {
return;
}
work();
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
task.addLog(sw.toString());
hibernateBaseDao.addOrModify(task);
}
}
/**
* 具体的多线程工作
* @throws Exception
*/
abstract protected void work() throws Exception;
这样,有任何新的多线程任务,只要继承上面的类,然后实现自己的work方法,就可以了。
当然,整个处理的过程中会有一些琐碎的问题要处理,这个就靠自己解决了。整个的思路大概就是这个样子,希望有助于大家对多线程的理解。