2016-08-19 3 views
0

私は、後で特定の期間で隔てられたほぼ一定の間隔で実行が必要な特定のクラスのメソッドを持っています。私はScheduledExecutorServiceを使ってこれを行う必要があります。Javaでの関数の1つのスレッド上での継続的な監視

また、このメソッドがどこからでも複数回呼び出されたとしても、新しいスレッドを開始することなく同じスレッドを実行します。

これをどのように達成できますか?

+0

エグゼキュータのサービスを作成するために使用するシングルスレッド実行者、および 'エグゼキュー#newSingleThreadScheduledExecutor()'。 –

答えて

1
  1. 指定された期間で区切られた一定の間隔でタスクを実行するために ScheduledExecutorService方法のscheduleAtFixedRateの方法を使用してください(これはシングルトンください)

    public class MainTask implements Runnable { 
    
        private static MainTask mainTask; 
    
        private MainTask(){ } 
    
        public static MainTask getInstance(){ 
         if(mainTask==null){ 
          mainTask = new MainTask(); 
         } 
         return mainTask; 
        } 
    
        @Override 
        public void run() { 
         // task to run goes here 
         System.out.println("Hello !! " + Thread.currentThread().getName()); 
        } 
    
    } 
    
  2. をRunnableをの実装クラスを作成します。

    そのメソッド定義は

    ScheduledFuture scheduleAtFixedRate(Runnableをコマンド、 長いinitialDelayの、 長期間、 TimeUnitでユニット)

    連続実行との間 期間 =期間です。 この値は、設定されたTimeUnitに応じて、min/hrs/daysなどになることに注意してください。この特徴として

  3. あなたは、それは私はあなたが別のクラスでスレッドの作成とタスクの作成をカプセル化し、それがClass.methodName for.eg MySchedulerが使用することを許可することができ示唆他のクラスによって使用されるようにしたいと思うものです。 execute();

    public class MyScheduler { 
    
        private static ScheduledExecutorService service; 
    
        private static MainTask mainTask; 
    
        static { 
         service = Executors.newSingleThreadScheduledExecutor(); 
         mainTask = MainTask.getInstance(); 
        } 
    
        public static void execute() { 
         service.scheduleAtFixedRate(mainTask, 0, 4, TimeUnit.SECONDS); 
    
        } 
    } 
    
+0

よく見えます。しかし、私がMyScheduler.execute()を何度も呼び出すと、mainTaskに同じスレッドを使用するのか、それとも新しいスレッドを作成するのでしょうか? –

+0

静的ブロックがある場合は、再利用される単一スレッドからなるスレッドプールを作成する 'Executors.newSingleThreadScheduledExecutor()'を使用しました。 – Kamal

関連する問題