[关闭]
@HUST-SuWB 2015-02-01T08:13:23.000000Z 字数 1072 阅读 434

一个Java多线程实例

项目实战


关于多线程,网络上给出的原理都很简单,无非就是继承thread类或者是实现runable接口,但是我第一次处理的时候会有一些理解上的困难,比如程序怎样补充待处理的任务,以及怎么进入多线程的具体执行等。

当然,由于我是在一个师兄的基础上实现,因此很多架构上的问题已经不需要考虑了,有了底层的基础后,开发上层的多线程代码还是比较方便的。由于我也不是很懂,只能简单讲解一下思路,大家一起讨论。

首先,解决多线程任务的来源问题:

  1. List<Task> tasks = dao.query("select task from Task task where task.taskType = 'type' and task.finishTime is null ");
  2. for (Task task : tasks) {
  3. executor.addTask(task);
  4. }

这里的解决方式是建一张表,把所有待处理的任务全部读进去,程序执行的时候再从表里读出来(任务执行完之后finishTime会有值,所以待处理的任务与处理过的任务的区别就在finishTime是否为空上)

这里的executor.addTask(task)就会把所有的待处理任务加到线程池java.util.concurrent.ThreadPoolExecutor中。

然后就是具体的程序执行过程了。

  1. public void run() {
  2. try {
  3. //如果已经被取消执行,则不执行
  4. if (cancelled) {
  5. return;
  6. }
  7. //如果即将执行时,该任务已经完成,则不执行
  8. hibernateBaseDao.refresh(task);
  9. if (task.getFinishTime() != null) {
  10. return;
  11. }
  12. work();
  13. } catch (Exception e) {
  14. StringWriter sw = new StringWriter();
  15. PrintWriter pw = new PrintWriter(sw);
  16. e.printStackTrace(pw);
  17. task.addLog(sw.toString());
  18. hibernateBaseDao.addOrModify(task);
  19. }
  20. }
  21. /**
  22. * 具体的多线程工作
  23. * @throws Exception
  24. */
  25. abstract protected void work() throws Exception;

这样,有任何新的多线程任务,只要继承上面的类,然后实现自己的work方法,就可以了。

当然,整个处理的过程中会有一些琐碎的问题要处理,这个就靠自己解决了。整个的思路大概就是这个样子,希望有助于大家对多线程的理解。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注