栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

thread调用引起的crash

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

thread调用引起的crash

        在使用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()。

恍然大悟,原来问题出在这里!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003379.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号