1

さまざまなスレッドでさまざまなタスクを実行するための長時間実行アプリケーションを作成したいと思います。各タスクには1分のタイムアウトが必要です。これが私の実装です:

runner = new Thread(new Runnable() { 
   @Override
   public void run() {  }
       // some actions here
});
runner.start();
startJoin = System.currentTimeMillis();            
runner.join(TIMEOUT);    
stopJoin = System.currentTimeMillis();

if ((stopJoin - startJoin) >= TIMEOUT)
            throw new TimeoutException("Timeout when reading the response from   process");

通常、動作してTimeoutExceptionsをスローしますが、数時間経っても何も実行されない場合があります。では、問題はThread.joinがAndroidで信頼できるかどうかということです。

その代わりにThread.waitを使用して通知することを考えていますが、あなたの意見ではどのような方法が良いですか?

4

2 に答える 2

0

Timer私はとを使用してすべての時間ベースのタスクを実行することを好みますTimerTask。次のコードを確認してください。おそらくこれはあなたにとって役立つはずです。

Timer t =new Timer();
    t.schedule(new TimerTask() {

        @Override
        public void run() {
            //The task you want to perform after the timeout period 
        }
    }, TIMEOUT);

編集

私はあなたの問題を解決しようとしています。@amicnghによって記述されたコードをベースコードとして使用しており、いくつかの変更を加えています。しばらくするとTIMEOUT、実行中のスレッドを閉じたいと思います。次のコードが正常に実行され、次の説明が表示されることを確認してください。

public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
    final long TIMEOUT=100;
    final long startJoin = System.currentTimeMillis();

    Thread runner = new Thread(new Runnable() {
        long stopJoin;
           @Override
           public void run() {
               try{
                   for(;;){
                       System.out.println("running "); 
                       stopJoin = System.currentTimeMillis();

                       if ((stopJoin - startJoin) >= TIMEOUT){
                         throw new Exception();  
                       }
                   }
               }
               catch (Exception e) {
                // TODO: handle exception
               }

           }
               // some actions here
        });

    runner.start();

    synchronized (ThreadTest.class) {
        ThreadTest.class.wait(TIMEOUT);
    }


    /*if ((stopJoin - startJoin) >= TIMEOUT)
        try {
            throw new Exception("Timeout when reading the response from   process");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/


        System.out.println("Running Thread");

}

}

スレッドAPIの説明によると、destroyまたはstop(したがって、これらのメソッドは両方とも非推奨になっています)安全ではなく、スレッドを停止する方法の1つは、例外をスローすることです。runnerしたがって、スレッド内のタイムアウトをチェックしています。synchronizedここで、メインスレッドを待機させることについては、スレッドへのアクセスを同期するために使用する2行のコードによって実行されます。

このコードと説明があなたの問題を解決することを願っています。

于 2012-06-13T09:17:29.487 に答える
0

以下のプログラムを参照してください。

public static void main(String[] args) throws InterruptedException {
    long TIMEOUT=100;
    Thread runner = new Thread(new Runnable() {
           @Override
           public void run() {

               for(;;){
                   System.out.println("running ");
               }

           }
               // some actions here
        });

    runner.start();
    long startJoin = System.currentTimeMillis();
    runner.join(TIMEOUT);
    long stopJoin = System.currentTimeMillis();

    if ((stopJoin - startJoin) >= TIMEOUT)
        try {
            throw new Exception("Timeout when reading the response from   process");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        System.out.println("Running Thread");

}

このプログラムは決して終了しません。つまり、ロジックが正しくありません。

使用する方が良いTimerTaskです。

于 2012-06-13T09:29:53.793 に答える