後にスレッドを使い果たし、私はそれに打撃を与えるでしょう。
次のコードをスレッドとして単独で起動するにはどうすればよいですか?要するに
...
Timeout.java
public class Timeout extends TimerTask {
boolean isDone = false;
@Override
public void run() {
// TODO something
synchronized(this) {
isDone=true;
this.notifyAll();
}
}
public synchronized void join() throws InterruptedException {
while(!this.isDone)
this.wait();
}
}
TimeoutRunner.java
public class TimerRunner implements Runnable {
@Override
public void run() {
Timeout timeout = new Timeout();
Timer timer = new Timer();
timer.schedule(timeout, 1000L);
try {
timeout.join();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
timer.cancel();
}
}
}
は、使用してTimeoutRunnerを実行します。
new Thread(new TimeoutRunner()).start();
joinメソッドは、タイムアウトタスクの実行が完了するまでスレッドをブロックします。その時にタイマーを閉じることができます。しかし、これは多くのスレッド作成とIMOの悪いプログラミングです。
Timerインスタンスを作成すると、タイムアウト#run()メソッドを実行するスレッドが作成されます。タイマーはあなたのタスクが実行の準備ができるまでブロックする独自の実行方法を持っています。指定されたタイムアウト時間が経過すると、タイマーはブロックを解除してタイムアウトを実行します。
タイムアウト操作が完了するまで、TimeoutRunnerスレッドはブロックされます。その時だけ、このスレッドは死ぬことができます。
Timerクラスは非常に制限されています。すべてのタスクに対して新しいインスタンスを作成する必要があります。私の選択肢では、ScheduledExecutorServiceがより良い選択肢です。タスクの実行を計画している間、ScheduledExecutorServiceを開いたままにしておきます。スケジュールされたキャッシュされたスレッドプールのようなものが必要な場合は、私のオープンソースプロジェクト(Scheduler)からこのクラスを自由に使用してください。これは、キャッシュされたスレッドプールでうまく動作します。
この質問は私には意味がありませんでした。 – erickson