[个人时间管理]线程饥饿与动态任务管理


虽然主标题有点像开发上的内容,但实际上不是那样的,讨论程序开发上的内容的目的是为了解决个人时间管理上的“动态任务管理”。

首先说下“动态任务管理”是什么。当你早上制定了一天的计划并付诸实施的话,很有可能遇到干扰或者未曾预期的新任务。处理这些干扰或者任务的过程我个人称为“动态任务管理”。不用说,动态任务管理是个人时间管理很重要的一项内容,如果你处理不好的话,会使得你早些安排的任务一团糟。

那么我为什么会想到“线程饥饿”呢?因为“动态任务管理”中每个任务就像是不同的线程,而你就是他们都需要占有的资源。面对这样非常严重的并发场景,肯定存在类似线程饥饿的场景。比如你正在项目中,突然IM(即时通讯工具)过来一条消息要你做XXX,而且是高等级的。没办法,你只能先做XXX。等你做完了,突然又有一条YYY过来……等到你想要重新开始项目的时候,发现一天已经差不多结束了!对你的项目来说,它在一天内饥饿了。

如果是程序的话,怎么解决这个问题呢?我现在了解到的有公平锁,其重点是把任务串行化,不允许任务插队。个人认为公平锁实际上忽略了线程的等级。

公平锁能应用到动态任务管理中么?个人觉得如果你变成串行话执行的话,周围的人估计要跳起来的,因为凡事都要等你做完后再说(感觉像是国企的作风?)而且公平锁并不是线程饥饿的唯一一种解决方案。

那么什么方法比较好呢?考虑到等级,又能减少任务上下文切换的方案?
虽然还没长期执行,个人认为自己找到了一种简单的方案:

// in task
if(newTask.score > currentTask.score) {
  save(currentTask)
  do(newTask)
} else {
  enqueue(newTask)
  continue(currentTask)
}

// task done
tasks.sortBy(_.score).headOption match {
  case Some(task) => do(task)
  case _ => println("Sir, no task now.")
}

用自然语言描述一下:
任务中时:
如果新任务比当前任务分数高,那么保存现有任务,执行新任务。
否则,把新任务放入队列,继续当前任务。

当前任务结束时:
排序任务,取最高分的任务并且执行,如果没有,那么代表你做完了所有任务。

这个方案中最重要的是任务的排序,即分数如何计算,这个仁者见仁,就个人来说,被中断的任务可能分数比较高。而且如果计算不合理的话,很可能仍旧导致“线程饥饿”。

以上是公交车上的一点想法,希望对各位的时间管理有帮助。