Android中thread.start()出现的thread already exist错误

来源:互联网 发布:淘宝网夏季竹凉席坐垫 编辑:程序博客网 时间:2024/05/17 06:48

报错信息:

FATAL EXCEPTION: main
                                                                          Process: com.example.lxx.game_lxx, PID: 31256
                                                                          java.lang.IllegalThreadStateException: Thread already started
                                                                              at java.lang.Thread.checkNotStarted(Thread.java:849)
                                                                              at java.lang.Thread.start(Thread.java:1059)
                                                                              at com.example.lxx.game_lxx.lxx01_GameView.surfaceCreated(lxx01_GameView.java:114)

问题产生:

在使用SurfaceView绘制游戏的过程中,创建了一个Thread,且在Thread中已经使用 了boolean值控制run函数中的循环,在SurfaceCreate方法中调用线程的thread.start()方法。在退出后,理论上因为退出时将标志位设为了false,Thread中run方法执行结束,应当自动销毁,但重新打开该活动时产生一个thread already exist错误。


分析原因:

thread是在活动创建时产生的,在整个活动持续过程中,除非该活动被finish(),否则该变量一直存在,即便线程执行结束被回收。追踪start()方法,可以看到如下代码

public synchronized void start() {        if(this.threadStatus != 0) {            throw new IllegalThreadStateException();        } 
发现异常正是从一条语句中抛出。接下来查找threadStatus变量,在整个文件中并没有找到有threadStatus改变的语句。如有人知道问题产生原因还请指导一下。


解决方法:将thread.start()替换为 new Thread(thread).start();这里需要检测一下之前使用标识位停止的线程是否被正常回收,使用Android studio-》tools-》Android device monitor  运行后看到的线程数和退出重新进入看到的线程数是相同的。证明之前的线程已经被正常回收,这样一来这个问题就得到解决。

原创粉丝点击