2011-01-04 12 views
4

ご質問が非常に簡単な場合は申し訳ありません。私は初心者です。Java:スレッドを別のスレッドで監視するにはどうしたらいいですか?

何かを計算するスレッドを作成する必要があります。最初のスレッドは、指定した時間内に最初のスレッドが関数を計算するかどうかを測定する必要があります。そうでなければ、例外をスローする必要があります。それ以外は答えを返します。

+0

私はあなたの質問を言い換えます。 Javaで条件付き同期を実行する方法Andrewは以下の良い例を示しました – overexchange

答えて

3

スレッドが完了したら同期オブジェクトに通知し、他のスレッドが完了するまでにxミリ秒待機します。

public class Main { 

private static final Object mThreadLock = new Object(); 

static class DoTaskThread extends Thread { 

    public void run() { 

      try { 
       int wait = new Random().nextInt(10000); 
       System.out.println("Waiting " + wait + " ms"); 
       Thread.sleep(wait); 
      } catch (InterruptedException ex) { 
      } 
      synchronized (mThreadLock) { 
       mThreadLock.notifyAll(); 
      } 

     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     synchronized (mThreadLock) { 
      DoTaskThread thread = new DoTaskThread(); 
      thread.start(); 

      try { 
       // Only wait 2 seconds for the thread to finish 
       mThreadLock.wait(2000); 
      } catch (InterruptedException ex) { 
      } 

      if (thread.isAlive()) { 
       throw new RuntimeException("thread took too long"); 
      } else { 
       System.out.println("Thread finished in time"); 
      } 
     } 
    } 
} 
+0

これは条件付きの同期(注文)です。いい例。あなたのコードは 'mThreadLock'オブジェクトに関連付けられたロックと待ち/エントリキューを内部的に使用しています。条件付き同期の最も良い例は、1つのロック+ 2つの条件varを必要とする複数のプロデューサー/消費者アルゴ(ここではhttps://en.wikipedia.org/wiki/Monitor_(同期)#Condition_variables_2)です – overexchange

5

私はjava.util.concurrentのコンポーネントを取るだろう -

public void myMethod() { 
    // select some executor strategy 
    ExecutorService executor = Executors.newFixedThreadPool(1); 
    Future f = executor.submit(new Runnable() { 
     @Override 
     public void run() { 
      heresTheMethodToBeExecuted(); 
     } 
    }); 
    try { 
     f.get(1000, TimeUnit.MILLISECONDS); 
    } catch (InterruptedException e) { 
     // do something clever 
    } catch (ExecutionException e) { 
     // do something clever 
    } catch (TimeoutException e) { 
     // do something clever 
    } 
} 
1

join簡単な例を、ロックを使用するよりもずっと簡単です。

join (millis)
ウェイツこのスレッドが死ぬのための最もmillisミリ秒 で。タイムアウトが0の場合 は永遠に待機することを意味します。

例コード:

Thread calcThread = new Thread(new Runnable(){ 
    @Override 
    public void run() { 
     //some calculation    
    } 
}); 
calcThread.start(); 

//wait at most 2secs for the calcThread to finish. 
calcThread.join(2000); 

//throw an exception if the calcThread hasn't completed. 
if(calcThread.isAlive()){ 
    throw new SomeException("calcThread is still running!"); 
} 
関連する問題