首页 > 解决方案 > 如何将函数调用限制为特定线程/执行程序

问题描述

我目前正在为移动应用程序设计数据库。最近我发现在后台访问数据库非常有用的功能:

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()函数中使用

标签: javaandroidmultithreadingkotlin

解决方案


如果您绝对需要确保代码在正确的线程上运行,您可以使用自定义线程然后检查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

推荐阅读