オブジェクトが一定期間待機するように結んだ。この期間では、オブジェクトはロックされ、どのコマンドも処理できません。待ち時間中に待機アクティビティがキャンセルされる可能性があります。オブジェクトを数ミリ秒間待機させ、待機時間中にアクティブ待機をキャンセルする方法はありますか?
はまず、私は、次の方法を試してみました、それは簡単な方法です:それは作品
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()メソッドでスレッドをキャンセルすることはできません。
私の問題を解決するには?
ここで、waitingTask.interrupt()を呼び出していますか? – Tudor
あなたは待ち時間を使用していません。割り込みはスレッドを起動させるのではなく、停止するためのものです。チュートリアルの同時実行数の同時参照: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 –
@Tudor call waitingTask.interrupt()、そしてもちろん、私はwaitingTaskインスタンスをグローバル変数に変更しなければなりませんでした。しかし、最初の質問はwaitingTask.start()が機能していないことです。 –