2016-10-26 4 views
0
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

class MyTask1 implements Runnable{ 
MyTask1(){ 
    new Thread(this).start(); 
} 
public void run(){ 
    System.out.println("Running"); 
} 
} 
public class Schedular_1 { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    ScheduledExecutorService ex = Executors.newScheduledThreadPool(1); 
    ex.scheduleAtFixedRate(new MyTask1(), 3, 10, TimeUnit.SECONDS); 
    } 

} 

scheduleAtFixedRateの最初の実行は、2番目のパラメータで定義した遅延後に期待されます。その後の実行は、3番目のパラメータ、つまり10秒ごとに定義する必要があります。しかし、実際には(MyTask1)は、mainメソッドを呼び出すとすぐに実行されています。 3秒後に2回目に実行され、10秒ごとに定期的に実行されます。scheduleAtFixedRateはタスクを即座に実行し、定義された遅延後に実行する必要があります。

ここではうまく動作するこのバージョンの別のバージョンがあります(link)。

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

class MyTask1 implements Runnable{ 
MyTask1(){ 
    new Thread(this).start(); 
} 
public void run(){ 
    System.out.println("Running"); 
} 
} 
public class Schedular_1 { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    ScheduledExecutorService ex = Executors.newScheduledThreadPool(1); 
    ex.scheduleAtFixedRate(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Testing..."); 
     } 
    }, 3, 10, TimeUnit.SECONDS); 
} 

} 

これらの2つの違いの違いは何ですか?それはなぜ異常に行動するのですか?

答えて

1

MyTask1には開始Threadは必要ありません。 正しいバージョンのMyTask1は、次のようになります。

class MyTask1 implements Runnable{ 
    MyTask1(){ 
    } 
    public void run(){ 
     System.out.println("Running"); 
    } 
} 
1

あなたのコード内の問題は、コンストラクタでスレッドを開始していることである。

MyTask1(){ 
    new Thread(this).start(); 
} 

あなたがscheduleAtFixedRateを実行すると、新しいインスタンスを作成し、新しいスレッドを開始しています。 ExecutorServiceは、タスクを期待通りに実行します。

2番目のバージョンでは、Runnableを実装する匿名クラスを定義しました。自分でスレッドを開始するのではなく、コードは期待通りに機能します。

関連する問題