2017-10-24 7 views
0

クライアントには、一定の間隔でアラームをスケジュールするSchedulerというクラスが用意されています。これを行うには、プライオリティキューにアラームを追加するクラスにsetAlarmというメソッドがあり、Timerプロシージャに、キューの上にあるものを起床して処理する時間を知るようにするには、notify()を実行します。以下は複数のスレッドはインスタンスへの参照をどのように維持できますか?

それが通知を受信したり、時間までのアップになるまでそれがお待ちしておりますので、今私は、別のスレッドで実行するようにTimer手順が必要になる基本的なインプリメンテーション

class Scheduler { 

    synchronized public void setAlarm(Date date) { 
     notify(); 
    } 

    synchronized private void alarmTimer() { 
     while (true) { 
      wait(); 
      System.out.println("Alarm Triggered"); 
     } 
    } 

の一例です。しかし、クライアントには2つのスレッドがあることに気付かないといけません。クライアント側では、schedulerInstance.setAlarm(myDate)を処理して処理する必要があります。

したがって、ScheduleralarmTimer()のために別のスレッドを作成する必要があります。右のthisオブジェクトを参照しながら、この新しいスレッドからalarmTimerを呼び出す方法はありますか? wait()notify()が動作するように、元のSchedulerインスタンスへの参照を複数のスレッドで保持したい状況を処理する正しい方法は何ですか?

+2

Java 5以降では、['ScheduledExecutorService'](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html)があります。仕事に使う。 – alfasin

答えて

0

これは、1つのアプローチは次のようになります...という

  • thisにあなたの参照を保持し、あなたのスレッド&を起動し、メソッドレベルでよりthis

    1. 拡張スレッド
    2. 同期

    class Scheduler extends java.lang.Thread { 
    
        public void setAlarm(Date date) { 
        synchronized(this) { 
         this.notify(); 
        } 
        } 
    
        private void alarmTimer() { 
        this.start(); 
        } 
    
        @Override 
        public void run() { 
        synchronized(this) { 
         while (true) { 
         this.wait(); 
         System.out.println("Alarm Triggered"); 
         } 
        } 
        } 
    } 
    

    他のすべての方法が考えられる。ここでは、待機中のオブジェクトの参照をアラーム開始&の間で停止させることができる。 (anyObject.wait()およびanyObject.notify()

  • +0

    スレッドを拡張するのは悪い習慣ではありませんか? ThreadPoolExecutorを使用するための推奨されたメソッドではありませんか? – sbhatla

    +0

    @sbhatla:いいえ、それは「それほど悪い練習ではありません」(スレッドを拡張する...多くのチュートリアル/学校で教えられて以来)。 'ThreadPoolExecutor'は拡張スレッドと競合しませんが、(複数の)スレッドを実行&管理するのはむしろ(適切な)"コンテナ "です。 – xerx593

    関連する問題