Build Your Own HandlerThread Part 2
有了 MessagePumpDefault
之后,我们就可以开始着手实现最核心的 MessageLoop
了。
不过在此之前,我们还首先需要实现一个辅助设施:PendingTask
。
PendingTask
一个 PendingTask
instance 表示一个等待被执行的 task,并且这个 task 可能是一个 delayed task。
因此 PendingTask
需要能够表示时序上的顺序,这个可以利用 Instant
类型的一个时间戳,结合一个 long
类型的 sequence-number。因为有可能两个 delayed tasks 的时间戳相同,此时就必须要用 seq-num 来区分先后顺序。
另外,PendingTask
为了能够表示 task 语义,他必须可以被执行。这可以通过内部存储一个 Runnable
或者 Callable
成员做到。
我们的实现选择 Runnable
,因为
- 我们当前的实现不考虑返回值,因为实现返回值和我们的主题没有直接关系。
CSP 的并发模型上如果要考虑使用某个任务的返回值,一般会使用类似于PostTaskAndReplyWithResult()
来组合两个函数;或者更一般的,使用 continuation 来 lifting restrictions - 懒得处理异常
1 | class PendingTask { |
我们使用了 AtomicLong
来存储当前的 sequence-number,因为我们不知道某个 PendingTask
会在哪个线程上被创建。