2012-01-14 7 views
0

私はScheduledThreadPoolExecutorクラスを使用して、以下のコードのように30秒または60秒ごとにタスクを実行するようにスケジュールしています。私はisRmi変数の値に基づいて "リアルタイム"で実行されるタスクを変更することができますが、私はそれが動作するように見えることはできません。私のアプリケーションの冒頭では、変数はユーザーの入力に基づいて設定されますが、プログラムの実行中に変数を変更しても、同じタスクが実行されます。手伝って頂けますか?ScheduledThreadPoolExecutorはリアルタイムでタスクを変更します

public void execute() { 

     ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(3); 

     scheduler.scheduleAtFixedRate(new ServPresTimer(player), 0, 30, TimeUnit.SECONDS); 

     if (!isRMI) { 
      scheduler.scheduleAtFixedRate(new P2PTimer(player), 1, 60, TimeUnit.SECONDS); 
     } else { 
      scheduler.scheduleAtFixedRate(new RMITimer(player), 1, 60, TimeUnit.SECONDS); 
     } 
    } 
+1

isRMI変数とは何ですか?どのようにそれを操作していますか? –

答えて

1

2つの異なるタスク(P2PとRMI)をスケジューリングする代わりに、isRMI変数の値に基づいて、P2Pタスクの実行内容またはRMIタスクの実行内容を実行する単一のタスク(P2POrRMI)をスケジュールします。あなただけのRMIやP2Pに委譲することで、このP2POrRMIタスクを作成することができるはずです。

public class P2POrRMITimer implements Runnable { 
    private Runnable p2p; 
    private Runnable rmi; 
    private ObjectWhichContainsTheFlag flagContainer; 

    public P2POrRMITimer(Runnable p2p, 
         Runnable rmi, 
         ObjectWhichContainsTheFlag flagContainer) { 
     this.p2p = p2p; 
     this.rmi = rmi; 
     this.flagContainer = flagContainer; 
    } 

    @Override 
    public void run() { 
     if (flagContainer.isRmi()) { 
      rmi.run(); 
     } 
     else { 
      p2p.run(); 
     } 
    } 
} 

... 

scheduler.scheduleAtFixedRate(new P2POrRMITimer(new P2PTimer(player), 
               new RMITimer(player), 
               this), 
           1, 
           60, 
           TimeUnit.SECONDS); 

それは一つのスレッドによって設定されるので、適切にisRMIへのアクセスを同期することを確認し、またはそれは揮発性にするために、そして他の人が読む(スケジューラースレッド)

+0

私に例を教えてもらえますか? – DaveQuinn

+0

@PMMP:私はそれをやった。 –

+0

本当にありがとう、それは働いた:)変更は即時、右ではないのですか?変更には60秒かかります。 – DaveQuinn

0

私はあなたには、いくつかのメモリの可視性の問題を持っている疑いがある、としてみてください:

private volatile boolean isRMI; 

volatileはここに非常に重要です。問題は、マルチスレッド環境では、あるスレッドの変数に加えられた変更が、他のスレッドから即座に(またはこれまでに)見えない可能性があるということです。 volatileはすべての変更をすべてのスレッドに直ちに表示させます。

また、AtomicBooleanを使用することもできます。

+0

私はそれを試しましたが、うまくいかなかった、それは同じタスクを実行します。 – DaveQuinn

関連する問題