- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个例子:
// max 1 pending task in queue
val queue = LinkedBlockingQueue<Runnable>(1)
// max 1 thread / 1 active task
val executor = ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, queue)
val start = System.currentTimeMillis()
fun run() {
val millis = System.currentTimeMillis() - start
val thread = Thread.currentThread().name
println("executing after $millis ms on thread $thread")
Thread.sleep(3000)
}
executor.execute { run() }
executor.execute { run() }
// executor.execute { run() } // RejectedExecutionException, ok
Thread.sleep(10_000)
val job = SupervisorJob()
val dispatcher = executor.asCoroutineDispatcher()
val exceptionHandler = CoroutineExceptionHandler { _, _ ->
println("never invoked")
}
val scope = CoroutineScope(job + dispatcher + exceptionHandler)
scope.launch { run() }
scope.launch { run() }
scope.launch { run() } // !
最后一行导致创建一个新线程,而不是抛出RejectedExecutionException
(或调用exceptionHandler
):
3 毫秒后在线程 pool-1-thread-1 上执行
3006 毫秒后在 thread pool-1-thread-1 上执行
在 thread pool-1-thread-1 上 10063 毫秒后执行
在线程 kotlinx.coroutines.DefaultExecutor 上 10079 毫秒后执行
13066 毫秒后在 thread pool-1-thread-1 上执行
如果队列已满,上面的代码应该会失败,但我认为无法使用 Kotlin 协程正确实现它:使用自定义 RejectedExecutionHandler
抛出不同的异常有助于实现所需的行为但违反了 Executor
/RejectedExecutionHandler
约定,并且可能会破坏其他代码。
最佳答案
Dispatcher
不是 Executor
,并且具有非常不同的契约(Contract)和目的。特别是,不能调度协程的恢复。
类比Java线程,它相当于Thread.destroy()
,它使线程消失得无影无踪。没有 finally
block 被执行,没有 synchronized
block 被退出,因为线程没有遇到任何使其完成的异常。 Thread.destroy()
已从 Java 中删除,这是有充分理由的。
请注意,没有可以向其抛出 RejectedExecutionException
的用户代码。您有一个非常狭窄的特殊情况,其中协程根本不暂停,它们只是开始。这是您与任务提交的类比似乎合理的唯一原因。
关于java - Kotlin CoroutineDispatcher 创建额外的线程而不是重新抛出 RejectedExecutionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56532550/
我有一个帮助类,用于在数据库 Realm 做一些工作。如您所知,我们在使用 Realm 时有一些限制,例如: Realm 实例不会在非循环线程上自动刷新。 Realm 对象只能在创建它们的线程上访问
我正在使用 重构我的应用程序刀柄 作为依赖注入(inject)管理器。 我有一个构造函数可注入(inject)类,构造函数中有两个参数。其中一个参数是 CoroutineDispatcher . cl
这是一个例子: // max 1 pending task in queue val queue = LinkedBlockingQueue(1) // max 1 thread / 1 active
我正在阅读 data layer guide由谷歌和链接段中,他们有以下 fragment : class NewsRemoteDataSource( private val newsApi: N
我正在尝试找到一种方法来很好地实现一个 IdlingResource,它将轮询 CoroutineDispatcher 的 isActive 属性。但是,从调试来看,检查此属性时似乎从来没有 Acti
我们最近开始在我们的 Android 应用程序上使用协程。一切都很顺利,直到有人写了一些大致相当于以下函数的东西: fun example(dispatcher: CoroutineDispatche
我是一名优秀的程序员,十分优秀!