08-17 18:26:44.540: E/AndroidRuntime(2405): FATAL EXCEPTION: Scheduler
08-17 18:26:44.540: E/AndroidRuntime(2405): java.lang.IllegalThreadStateException: Thread already started.
08-17 18:26:44.540: E/AndroidRuntime(2405): at java.lang.Thread.start(Thread.java:1045)
08-17 18:26:44.540: E/AndroidRuntime(2405): at com.example.simpledownloader.scheduler.Scheduler.run(Scheduler.java:21)
08-17 18:26:44.540: E/AndroidRuntime(2405): at java.util.Timer$TimerImpl.run(Timer.java:284)
因此,我有一个
TimerTask
,它通过蛮力检查所有未决的下载。下载全部
Thread
存储在Vector
中。一旦TimerTask
看到一个线程已准备就绪,它将在其上调用start()
。这是代码:码:
package com.example.simpledownloader.scheduler;
import java.util.TimerTask;
import android.util.Log;
import com.example.simpledownloader.sharable.Sharable;
import com.example.simpledownloader.task.Task;
public class Scheduler extends TimerTask {
//------------------------------------------------------------------------------
@Override
public void run() {
if(Sharable.getShouldLook()){ // Should we look for pending tasks ?
for(Task each: Sharable.downloads){ // Yes, then loop
if(each.isAlive()==false){ // Thread is not running ?
Log.v("SCHEDULER", "NOT RUNNING");
if(each.getReadiness() == true){ // Is it ready ?
each.start(); // Start !
break; // stop looping
}
}
}
}
}
//------------------------------------------------------------------------------
}
为什么我不断收到该错误?
Timer
设置如下:Sharable.schedulerTimer.scheduleAtFixedRate(Sharable.schedulerTask, 1000, 1000); // start scheduler
最佳答案
如果isAlive()
返回false,则在启动线程之前进行检查。有两种方法不足以阻止您获取IllegalThreadStateException
:
在调用isAlive()
和start()
之间有一些其他线程正在启动下载线程,或者
下载线程将终止,而不会从您的Sharable.downloads
集合中删除。
我怀疑后者的可能性更大,所以这就是我开始寻找的地方。另外,如果您希望在下载完成后将线程保留在下载集中,则可以尝试使用each.getState() == Thread.State.NEW
而不是each.isAlive() == false
。