2013-08-17 9 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이 있습니다.
다운로드는 Vector에 저장된 Thread입니다. 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이 같은 설정 : 당신이 만약 isAlive() false를 반환 스레드를 시작하기 전에

Sharable.schedulerTimer.scheduleAtFixedRate(Sharable.schedulerTask, 1000, 1000); // start scheduler 
+0

* Sharable * 클래스는 여러 활동에서 공유되는 모든 싱글 톤 인스턴스를 보유합니다. –

+0

실 죽은 후에는 다시 시작할 수 없습니다. – aim

+0

@aim 중단 된 후에 의미합니까? –

답변

1

당신은 확인 중입니다. 다른 thread가 isAlive() 호출 및 start()에 대한 호출 사이의 다운로드 스레드를 시작

  1. , 또는

  2. 두 이것이 IllegalThreadStateException을받지 못하게하기에 충분하지 않을 수 있다는 가지 방법이 있습니다 다운로드 스레드가 귀하의 Sharable.downloads 컬렉션에서 삭제되지 않고 종료됩니다.

나의 의심은 후자가 더 그렇기 때문에 내가보기 시작할 곳이다. 또는 완료 후 다운로드 컬렉션에 스레드를 유지하려면 each.isAlive() == false 대신 each.getState() == Thread.State.NEW을 시도 할 수 있습니다.

+0

그래, 이미'synchronized '메소드 인'getIsReadyForDownload()'에 메소드를 추가했습니다. –

+0

메소드 동기화가 충분하지 않습니다. 다운로드 스레드를 시작할 수있는 스레드가 여러 개인 경우, 스레드를 시작한 직후까지 'isReadyForDownload'또는 'isAlive'를 확인하기 직전부터 시작하는 모든 코드가 동일한 객체 (다운로드 스레드 자체가 가장 쉽다)에서 동기화되는지 확인하십시오. – Jules

관련 문제