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保留中のすべてのダウンロードをブルート フォースでチェックする方法があります。ダウンロード
はすべて. スレッドの準備ができていることがわかるとすぐに、それを呼び出します。コードは次のとおりです。 ThreadVectorTimerTaskstart()

コード:

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
4

1 に答える 1

1

isAlive()false を返す場合は、スレッドを開始する前に確認しています。を取得するのを防ぐのにこれが十分でない可能性がある 2 つの方法がありますIllegalThreadStateException

  1. isAlive()への呼び出しとへの呼び出しの間に他のスレッドがダウンロード スレッドを開始しているstart()、または

  2. ダウンロード スレッドはコレクションから削除されずに終了していますSharable.downloads

私の疑いでは、後者の可能性が高いので、そこから探し始めます。または、終了後もスレッドをダウンロード コレクションに保持したい場合はeach.getState() == Thread.State.NEWeach.isAlive() == false.

于 2013-08-17T19:08:18.660 に答える