Advertisement
Guest User

Untitled

a guest
Aug 15th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.50 KB | None | 0 0
  1. import kotlinx.coroutines.experimental.Deferred
  2. import kotlinx.coroutines.experimental.async
  3. import kotlinx.coroutines.experimental.delay
  4. import java.util.*
  5. import java.util.concurrent.ArrayBlockingQueue
  6.  
  7. fun main(args: Array<String>) {
  8.     val defColl = (0..10000).map {
  9.         async {
  10.             delay(Random().nextInt(500))
  11.             it
  12.         }
  13.     }
  14.     val esh = ExecutorServiceHolder(defColl)
  15.  
  16.     esh.forEach {
  17.         println(it)
  18.     }
  19. }
  20.  
  21. class ExecutorServiceHolder<T>(pool: Collection<Deferred<T>>, val waitTime: Long = 500) : Iterable<T> {
  22.     private val pool = HashSet(pool)
  23.     private val resultQueue = ArrayBlockingQueue<T>(pool.size)
  24.     private val iterator = ExecutorIterator()
  25.  
  26.     override fun iterator(): Iterator<T> = iterator
  27.  
  28.     private inner class ExecutorIterator : Iterator<T> {
  29.         override fun hasNext(): Boolean = resultQueue.isNotEmpty() || pool.isNotEmpty()
  30.  
  31.         override fun next(): T {
  32.             extractResults()
  33.             return resultQueue.poll()
  34.         }
  35.  
  36.         private fun extractResults() {
  37.             while (resultQueue.isEmpty()) {
  38.                 val completed = pool.filter {
  39.                     it.isCompleted
  40.                 }
  41.  
  42.                 pool.removeAll(completed)
  43.  
  44.                 completed.forEach {
  45.                     resultQueue.add(it.getCompleted())
  46.                 }
  47.                 if (resultQueue.isEmpty()) {
  48.                     Thread.sleep(waitTime)
  49.                 }
  50.             }
  51.         }
  52.     }
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement