|
Scala example source code file (ConcurrentTaskTest.scala)
The ConcurrentTaskTest.scala Scala example source code
package scalaz.concurrent
import scalaz.{\/, SpecLite}
import scalaz.concurrent.Task._
import java.util.concurrent.{ThreadFactory, Executors}
import scala.collection.immutable.Queue
import scala.concurrent.SyncVar
import scalaz.\/._
/**
*
* User: pach
* Date: 7/9/13
* Time: 6:53 PM
* (c) 2011-2013 Spinoco Czech Republic, a.s.
*/
object ConcurrentTaskTest extends SpecLite {
"Task" should {
"correctly use threads when forked and flatmapped" in {
@volatile var q = Queue[(Int, String)]()
val forked = "forked-thread"
val current = Thread.currentThread().getName
def enqueue(taskId: Int) =
q = q.enqueue((taskId, Thread.currentThread().getName))
val es = Executors.newFixedThreadPool(1, new ThreadFactory {
def newThread(p1: Runnable) = new Thread(p1, forked)
})
val sync = new SyncVar[Boolean]
(for {
_ <- now(enqueue(1))
_ <- delay(enqueue(2))
_ <- fork(now(enqueue(3)))(es)
_ <- delay(enqueue(4))
_ <- fork(now(enqueue(5)))(es)
_ <- now(enqueue(6))
_ <- fork(delay(enqueue(7)))(es)
} yield ()).unsafePerformAsync(_ => {
enqueue(8)
sync.put(true)
})
enqueue(9)
sync.get(5000) must_== Some(true)
val runned = q.toList
//trampoline should be evaluated at the head before anything else gets evaluated
runned(0) must_== (1,current)
runned(1) must_== (2,current)
//the after async must not be the last ever
(runned.last._1 != 9) must_==(true)
//the rest of tasks must be run off the forked thread
runned.filter(_._2 == forked).map(_._1) must_== List(3,4,5,6,7,8)
}
"complete even when interrupted" in {
val t = Task.fork(Task.delay(Thread.sleep(3000)))
val sync = new SyncVar[Throwable\/Unit]
val interrupt = t.unsafePerformAsyncInterruptibly(sync.put)
Thread.sleep(1000)
interrupt()
sync.get(3000) == Some(left(Task.TaskInterrupted))
}
}
}
Other Scala examples (source code examples)Here is a short list of links related to this Scala ConcurrentTaskTest.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.