2012-02-23 1 views
0

は、私は、コードのこの部分を持っている:実行スレッドとしてクラスインスタンス自体によっては

Timeout s = new Timeout(); 
Timer timer = new Timer(); 
timer.schedule(s, 1000L); // fires after 1 second 

は、どのように私はそれだけでスレッドとして次のコードを起動することができますか?タイマーとTimeoutをRunnableに渡してから起動する必要がありますか?タイマーが起動する前にスレッドのRun()が終了するとどうなりますか?

私の代わりにこれを行うことを考えています:

ScheduledExecutorService ses = Executors.newScheduledThreadPool(1); 
     Timeout s = new Timeout(); // Timeout is a runnable 
     ses.schedule(s, 10, TimeUnit.SECONDS); 

が、どのように私はタイムアウト後にスレッドを終了しますか?私はあなたが求めているものを正確にわからないんだけど、しばらく

おかげ

+0

この質問は私には意味がありませんでした。 – erickson

答えて

2

後にスレッドを使い果たし、私はそれに打撃を与えるでしょう。

次のコードをスレッドとして単独で起動するにはどうすればよいですか?要するに

...

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)からこのクラスを自由に使用してください。これは、キャッシュされたスレッドプールでうまく動作します。

関連する問題