2012-01-01 3 views
-2

オブジェクトが一定期間待機するように結んだ。この期間では、オブジェクトはロックされ、どのコマンドも処理できません。待ち時間中に待機アクティビティがキャンセルされる可能性があります。オブジェクトを数ミリ秒間待機させ、待機時間中にアクティブ待機をキャンセルする方法はありますか?

はまず、私は、次の方法を試してみました、それは簡単な方法です:それは作品

public void toWaiting(int waitingTime) 
{ 
    synchronized(this) // this is the reference for the current object 
    { 
     try { 
      this.wait(waitingTime); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
    } 
} 

、現在のオブジェクトは、待機のためにブロックされる可能性がありますが、私は待ち時間の間、この待機アクティビティをキャンセルすることはできません。

私はこの問題に対処するためにスレッドを使用しようとしました。 waitメソッドをスレッドに入れ、呼び出しによって待ちアクティビティを取り消します。Thread.interrupt()。私は以下のコードを書いている:私はwaitingTask.startを(変更しない限り、現在のオブジェクトは、ブロックされていないため

public void toWaiting(int waitingTime) 
{ 
    robotWaitTask waitingTask = new robotWaitTask(waitingTime); 
    waitingTask.start(); 
} 

// Generate a thread which could cause the object waiting for a interval 
class robotWaitTask extends Thread 
{ 
    int waitingTime; 

    public robotWaitTask(int waitingTime) 
    { 
     this.waitingTime = waitingTime; 
    } 

    public void run() 
    { 
     synchronized(this) 
     { 
      try { 
       this.wait(waitingTime); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

以上が動作していない)にwaitingTask.run()(私はしないでください理由を知って、例外はありません)。私はrunメソッドを呼び出して新しいスレッドを生成させないことを知っています。それはただの呼び出しです。したがって、waitingTask.run()を使用すると、interrupt()メソッドでスレッドをキャンセルすることはできません。

私の問題を解決するには?

+0

ここで、waitingTask.interrupt()を呼び出していますか? – Tudor

+2

あなたは待ち時間を使用していません。割り込みはスレッドを起動させるのではなく、停止するためのものです。チュートリアルの同時実行数の同時参照:http://docs.oracle.com/javase/tutorial/essential/concurrency/index.htmlを参照してください。 waitメソッドのjavadocにも便利な情報があります。http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28long%29 –

+0

@Tudor call waitingTask.interrupt()、そしてもちろん、私はwaitingTaskインスタンスをグローバル変数に変更しなければなりませんでした。しかし、最初の質問はwaitingTask.start()が機能していないことです。 –

答えて

0

コードが機能しているはずです。 .run()を使用するように変更しない限り、現在のオブジェクトはブロックされていないと言いました。 .run()を呼び出すと、そのメソッドは現在のスレッドで実行されており、別のスレッドでは実行されていないことを意味します。それはたぶんあなたがブロックしていることに気付いているのかもしれません。 .start()を使用すると、別のスレッドが作成され、オブジェクトはその別のスレッドでブロックされます。同時に、メインスレッドは実行を継続します。

robotWaitTask waitingTask = new robotWaitTask(1000); 
waitingTask.start(); //start a new thread, and the object is blocked in a separate thread 
//this line will print as soon as the previous line called even before 1000ms 
System.out.println("here)"; 


robotWaitTask waitingTask = new robotWaitTask(1000); 
waitingTask.run(); 
//this line will print after 1000ms because the object is blocked in this thread 
System.out.println("here)"; 
+0

あなたの答えをありがとう!あなたが正しいです、私はメインのスレッドをブロックし、現在のオブジェクトがブロックされていると思った... –

関連する問題