在科特林停止线程

时间:2018-04-23 19:11:45

标签: java multithreading kotlin handler

首先我是Kotlin的新人,所以请你好:) 这也是我第一次在StackOverflow上发帖

我想完全停止我创建的当前线程但没有任何作用,我尝试了quit(),quitSafely(),interrupt()但没有:/

我在我的Data.kt中创建了一个创建和初始化Handler和HandlerThread的类:

SQL

}

现在在我的DataManager中,我用它们来做异步事情:

class Dispatch(private val label: String = "main") {

var handler: Handler? = null
var handlerThread: HandlerThread? = null

init {
    if (label == "main") {
        handlerThread = null
        handler = Handler(Looper.getMainLooper())
    } else {
        handlerThread = HandlerThread(label)
        handlerThread!!.start()
        handler = Handler(handlerThread!!.looper)
    }
}

fun async(runnable: Runnable) = handler!!.post(runnable)

fun async(block: () -> (Unit)) = handler!!.post(block)

fun asyncAfter(milliseconds: Long, function: () -> (Unit)) {
    handler!!.postDelayed(function, milliseconds)
}

fun asyncAfter(milliseconds: Long, runnable: Runnable) {
    handler!!.postDelayed(runnable, milliseconds)
}

companion object {
    val main = Dispatch()
    private val global = Dispatch("global")
    //fun global() = global
}

现在在我的MainActivity中我创建了2个按钮,一个用于运行函数getSomething(),另一个用于切换到另一个Controller View

fun getSomething(forceNetwork: Boolean ) {

        val queue1 = Dispatch("thread1") // Create a thread called "thread1"
        queue1.async {
            for (i in 0..2_000_000) {
                 print("Hello World")
                 // Do everything i want in the current thread
            }

            // And on the main thread I call my callback
            Dispatch.main.async {
                //callback?.invoke(.........)
            }
        }
    }

有没有办法让我停止线程,因为当我切换到第二个视图时,打印(" Hello World")仍然不幸 谢谢你帮助我们,我希望你明白!

1 个答案:

答案 0 :(得分:3)

线程需要定期检查(全局)标志,当它变为true时,该线程将退出循环。未经同意,无法安全停止Java线程。

请参阅此处的http://www.rjspm.com/PDF/JavaTheCompleteReference.pdf第252页,其中描述了图例背后的真实故事。

我认为,只有通过操作系统内核的支持,才能实现真正可中断的线程。 CPU硬件微处理器将实际的真正锁定保持在最下方。