结论
- EventLoop是一个调度,其内部使用
LinkedBlockingDeque
类型的eventQueue
对象,存储待处理的任务。
- 死循环调度线程
eventThread
不停的查询 eventQueue
中的新数据。
- 通过
post
方法, 提交任务到队列中。
EventLoop -> onReceive
方法回调 内部类的方法 DAGScheduler -> DAGSchedulerEventProcessLoop -> onReceive
EventLoop -> eventQueue 核心对象
private[spark] abstract class EventLoop[E](name: String) extends Logging {
private val eventQueue: BlockingQueue[E] = new LinkedBlockingDeque[E]()
EventLoop -> eventThread
private[spark] val eventThread = new Thread(name) {
setDaemon(true)
override def run(): Unit = {
try {
// 没有外界停止的信号,就不停的从队列中获取数据,回调处理方法。
while (!stopped.get) {
val event = eventQueue.take()
try {
onReceive(event)
}
...
}
EventLoop -> start
def start(): Unit = {
...
// 启动死循环线程
eventThread.start()
}
EventLoop -> post
def post(event: E): Unit = {
...
// 提交任务到队列中
eventQueue.put(event)
...