java - 如何将函数调用限制为特定线程/执行程序
问题描述
我目前正在为移动应用程序设计数据库。最近我发现在后台访问数据库非常有用的功能:
private val IO_EXECUTOR = Executors.newSingleThreadExecutor()
fun ioThread(f : () -> Unit) {
IO_EXECUTOR.execute(f)
}
除此之外,我发现不需要同步代码,因为数据库只能在一个线程(即使用的线程SingleThreadExecutor
)中访问。
唯一的问题是必须将以下方法限制为只能通过ioThread
函数(或使用IO_EXECUTOR
)调用。
abstract class MyDatabase : RoomDatabase() {
companion object {
fun init(context: Context) { ... }
fun getInstance() { ... }
}
是否有可能在Kotlin
/中实现这一点Java
?
更新:现在我有这个实现,但认为应该有更好的
// App.kt file
private val IO_EXECUTOR = Executors.newSingleThreadExecutor()
private var IO_THREAD_ID: Long = -1L
private fun getIOThreadId(): Long {
if (IO_THREAD_ID == -1L)
IO_THREAD_ID = IO_EXECUTOR.submit(Callable<Long> { Thread.currentThread().id }).get()
return IO_THREAD_ID
}
fun notInIOThread() = Thread.currentThread().id != getIOThreadId()
fun ioThread(f : () -> Unit) {
IO_EXECUTOR.execute(f)
}
然后notInIOThread()
在init()
和getInstance()
函数中使用
解决方案
如果您绝对需要确保代码在正确的线程上运行,您可以使用自定义线程然后检查Thread.currentThread()
接口。
private interface MarkedIOThread // Marker interface
private val IO_EXECUTOR = Executors.newSingleThreadExecutor { r ->
return object : Thread(r), MarkedIOThread
}
fun notInIOThread(): Boolean = Thread.currentThread() !is MarkedIOThread
推荐阅读
- python - 在R中加载泡菜
- oracle - 顶点交互式网格选择列表
- php - 从数据库表中检索数据时出现错误
- python - 如何在 Python 中进行并行处理?
- node.js - 在 Adonisjs 中插入多行不起作用
- java - 使用 brew cask 在 MacOs Catalina10.15 上安装 Java6
- scala - 如何将 Set[Tuple2] 中的数据转换为案例类
- c++ - 嵌套的 lambda 和可变关键字
- twitter-bootstrap - 将 Bootstrap 3 迁移到 4 后的布局问题(表格宽度、内联元素未垂直堆叠)
- python - 为什么 map 函数从数据框中删除列