object one_Executor extends App {
/**
* 下面的代码展示了实例化ForkJoinPool接口的方式,
* 以及对其提交能够通过,异步处理任务的方式
* */
import scala.concurrent._
val executor = new forkjoin.ForkJoinPool()
executor.execute(new Runnable {
override def run(): Unit = println("This task is run asynchronously")
})
/**
* 这里加一个sleep的原因是?
* 用以防止ForkJoinPool对象中的 “守护线程” 在调用Runnable对象中的run方法之前被终止。
* (默认情况下ForkJoinPool对象创建的线程都是守护线程)
* */
// Thread.sleep(500) //有了awaitTermination就不用在用sleep了
executor.shutdown() //调用shutdown时,不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常
//awaitTermination是一个阻塞方法。它必须等待线程池(ForkJoinPool(Executor))“退出”后才会结束自身。(shutdown放在其后面根本不会运行,因为都已经堵塞了)
// 1、因为是守护线程,main线程没退出,守护线程也不会“退出”,所以就在这堵塞了
// 2、shutdown放在其前面,awaitTermination等待期间,shutdown也在等待任务的结束。
// 等待期间,任务结束了shutdown才会关闭线程并“退出”,awaitTermination发现shutdown退出,则表示任务结束,此时会返回true。
// 等待期间,awaitTermination发现shutdown没有退出,则表示任务没结束,此时会返回false。
val b: Boolean = executor.awaitTermination(2, TimeUnit.SECONDS)
println(b) //true
}
object ceshi extends App{
val a = ExecutionContext.global
a.execute(new Runnable{
def run()=log.info("创建")
})
Thread.sleep(500)
}
object ceshi extends App{
val pool = new forkjoin.ForkJoinPool(2)
val a = ExecutionContext.fromExecutorService(pool)
a.execute(new Runnable{
def run()=log.info("创建")
})
Thread.sleep(500)
}
注意:
ExecutionContext类的伴生对象,定义了2个方法:
(本文章虽然采用的代码为scala代码,但java代码与Scala代码可以互相转换,且本质上两者所阐述的东西都是一致的)