2013-08-17 73 views
1
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()。這裏是代碼:爲什麼我的TimerTask中出現這個錯誤?

代碼:

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 
+0

* Sharable *類包含所有在活動中共享的單例實例。 –

+0

線程死後不能再次啓動。 – aim

+0

@aim你的意思是它被打斷了嗎? –

回答

1

啓動線程,如果isAlive()返回false之前,您正在檢查。有兩種方法,這可能不足以阻止你獲得IllegalThreadStateException

  1. 其他某些線程開始調用isAlive()和調用start()的下載線程,或

  2. 下載線程正在終止,不會從您的Sharable.downloads集合中刪除。

我懷疑是後者更可能,所以這是我開始尋找的地方。或者,如果您想在完成後將您的主題保留在下載集合中,則可能需要嘗試each.getState() == Thread.State.NEW而不是each.isAlive() == false

+0

是的,我已經添加了一個方法到名爲getIsReadyForDownload()的'Task',它是'synchronized' –

+0

同步方法是不夠的 - 如果你有多個線程可能會啓動你的下載線程,你必須確保所有可能啓動它們的代碼都在同一個對象上同步(最簡單的就是下載線程本身),直到線程剛剛啓動之後,它才檢查'isReadyForDownload'或'isAlive'。 – Jules

相關問題