2012-05-01 5 views
0

JavaのNIOセレクタで定期的な汎用イベントを受け取ることはできますか? boost::asioに私は前にdeadline_timerを使用しました。Java NIOで汎用タイマー(定期イベント)を実装していますか?

たとえば、セレクタがアクティブなソケットの負荷量に依存せずに、セレクタが実行しているスレッドと同じスレッドで1秒に1回だけ関数を呼び出したいとします(1秒以上受信ソケットメッセージを処理する)。このような

+0

をはい、それは可能です:イベントの前に残っているどのくらいの時間に基づいて選択するようにタイムアウトを供給しています。選択は、データのブロック(ハンドル)またはタイムアウト(ハンドル)のいずれかになります。すすぎ、繰り返します。あるいは、XNIOなど、これをサポートするover-NIOライブラリの1つを使用することもできます。 –

答えて

1

何かがうまくいくかもしれない:

private final BlockingQueue<YourFunction> queue = ... 

public void run() { 
    while(!queue.isEmpty()) { 
     queue.poll().performAction(); 
    } 

    selector.select(); 

    Iterator<SelectionKey> itr = selector.selectedKeys().iterator(); 
    while(itr.hasNext()) { 
     // etc... 
    } 
} 

public static void main(String[] args) { 
    Timer t = new Timer(name, daemon); 
    t.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      queue.add(new YourFunction()); 
      selector.wakeup(); 
     } 
    }, 0, 1000); 
} 
関連する問題