2017-10-22 11 views
-1

プログラムAはexecute()メソッドで実行され、txtファイルに文字列を書き込むたびに繰り返します。ときどきこのプログラムがブロックされ、私はそれを止め、どこから再起動するかを知っているexecute()メソッドを思い出す必要があります。私はスレッドを拡張するプログラムBを持っています。それはAと並行して実行され、プログラムAがブロックされているかどうかを毎回確認しますが、オブジェクトAをブロックして独自の方法で再起動する方法はわかりません。これを行う最も簡単な方法は何ですか?貼り付けられたJavaプログラムを自動的に再起動する方法

p.s.プログラムAは、私が悪いプログラマー(私は他の理由でそうです)ではなく、私の望むことを私に許さないオンラインサービスで動作するからです。

+3

*時にはこのプログラムがブロックされ、私はそれを止める必要があります*:まあ、最初は起こらないはずです。あなたのバグを回避しようとしないでください。代わりにそれらを修正してください。しかし、あなたは一行のコードを投稿していないので、私たちは助けることはできません。 –

答えて

0

Conditionを使用して、条件がガードスレッドの指定された期間に満たされるのを待つことができます。条件が長すぎる場合、ガードスレッドはInterruptedExceptionを受信します。

import java.util.Objects; 
import java.util.concurrent.TimeUnit; 
import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 

public class Main { 
    private static class PotentiallyBlockingTask implements Runnable { 
     private final Lock lock; 
     private final Condition condition; 

     public PotentiallyBlockingTask(Lock lock, Condition condition) { 
      this.lock = Objects.requireNonNull(lock); 
      this.condition = Objects.requireNonNull(condition); 
     } 

     @Override 
     public void run() {   
      // run the task 

      // signal the guard thread that it is done. 
      lock.lock();    
      try { 
       condition.signal(); 
      } finally { 
       lock.unlock(); 
      } 
     } 
    } 

private static class GuardTask implements Runnable { 
    private final Lock lock; 
    private final Condition condition; 

    public GuardTask(Lock lock, Condition condition) { 
     this.lock = Objects.requireNonNull(lock); 
     this.condition = Objects.requireNonNull(condition); 
    } 

    public void run() { 
     lock.lock(); 
     try { 
      condition.await(30, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      // handle situation 
     } finally { 
      lock.unlock(); 
     } 
    } 
} 

    public static void main(String[] args) { 
     ReentrantLock lock = new ReentrantLock(); 
     Condition condition = lock.newCondition(); 

     PotentiallyBlockingTask pbt = new PotentiallyBlockingTask(lock, condition); 
     GuardTask gt = new GuardTask(lock, condition); 
    //.... 
    } 
} 
関連する問題