@@ -24,15 +24,17 @@ import scala.collection.mutable.{ArrayBuffer, SynchronizedBuffer}
2424import org .apache .spark .Logging
2525
2626/** Asynchronously passes SparkListenerEvents to registered SparkListeners. */
27- private [spark] class SparkListenerBus () extends Logging {
28- private val sparkListeners = new ArrayBuffer [SparkListener ]() with SynchronizedBuffer [SparkListener ]
27+ private [spark] class SparkListenerBus extends Logging {
28+ private val sparkListeners = new ArrayBuffer [SparkListener ] with SynchronizedBuffer [SparkListener ]
2929
3030 /* Cap the capacity of the SparkListenerEvent queue so we get an explicit error (rather than
3131 * an OOM exception) if it's perpetually being added to more quickly than it's being drained. */
32- private val EVENT_QUEUE_CAPACITY = 10000
32+ private val EVENT_QUEUE_CAPACITY = 10000
3333 private val eventQueue = new LinkedBlockingQueue [SparkListenerEvents ](EVENT_QUEUE_CAPACITY )
3434 private var queueFullErrorMessageLogged = false
3535
36+ // Create a new daemon thread to listen for events. This thread is stopped when it receives
37+ // a SparkListenerShutdown event, using the stop method.
3638 new Thread (" SparkListenerBus" ) {
3739 setDaemon(true )
3840 override def run () {
@@ -53,6 +55,9 @@ private[spark] class SparkListenerBus() extends Logging {
5355 sparkListeners.foreach(_.onTaskGettingResult(taskGettingResult))
5456 case taskEnd : SparkListenerTaskEnd =>
5557 sparkListeners.foreach(_.onTaskEnd(taskEnd))
58+ case SparkListenerShutdown =>
59+ // Get out of the while loop and shutdown the daemon thread
60+ return
5661 case _ =>
5762 }
5863 }
@@ -80,7 +85,7 @@ private[spark] class SparkListenerBus() extends Logging {
8085 */
8186 def waitUntilEmpty (timeoutMillis : Int ): Boolean = {
8287 val finishTime = System .currentTimeMillis + timeoutMillis
83- while (! eventQueue.isEmpty() ) {
88+ while (! eventQueue.isEmpty) {
8489 if (System .currentTimeMillis > finishTime) {
8590 return false
8691 }
@@ -90,4 +95,6 @@ private[spark] class SparkListenerBus() extends Logging {
9095 }
9196 return true
9297 }
98+
99+ def stop (): Unit = post(SparkListenerShutdown )
93100}
0 commit comments