在使用thread来创建线程时,一运行就crash报错了,代码和报错内容如下:
代码:
thread {
Thread.sleep((background.numberOfFrames * background.getDuration(0)).toLong())
handler.sendEmptyMessage(1)
}.start()
报错:
java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:724)...
感觉简直不可思议,这是最简单的代码怎么都会报错。看错误内容说的是线程非法状态异常,通常来说是同一个thread,重复调用了start()方法。
然后上网百度了下kotlin关于线程的使用,网上教程为:
在kotlin中thread的runnable匿名类实例
new 改为了object
Thread(object : Runnable {
override fun run() {
Thread.sleep(1000)
}
}).start()
runnable里面只有一个run方法,可以简化为如下:
Thread(Runnable {
Thread.sleep(1000)
}).start()
Thread里面只有一个Runnable ,我们可以把接口名省略,括号也可以省略
Thread {
Thread.sleep(1000)
}.start()
细心的朋友应该能看到,人家用的是thread {xxx}.start()。Thread是大写的T,而我使用的是小写的t,即thread {xxx}.start()。
这两种写法编译器都没有报错。所以需要看下thread {xxx}.start()和正常的线程创建写法有什么差异。通过进入到thread的定义处,发现其被定义在Thread.kt文件中,thread是其内部的一个全局函数,代码为:
public fun thread(
start: Boolean = true,
isDaemon: Boolean = false,
contextClassLoader: ClassLoader? = null,
name: String? = null,
priority: Int = -1,
block: () -> Unit
): Thread {
val thread = object : Thread() {
public override fun run() {
block()
}
}
if (isDaemon)
thread.isDaemon = true
if (priority > 0)
thread.priority = priority
if (name != null)
thread.name = name
if (contextClassLoader != null)
thread.contextClassLoader = contextClassLoader
if (start)
thread.start()
return thread
}
可以看到:
1、thread是一个函数,函数内部创建了一个线程;
2、默认情况下,函数参数start=true, 即调用thread方法默认情况下就已经执行了start()。
恍然大悟,原来问题出在这里!!



