2010-12-16 12 views
0

バックグラウンドスレッドでの処理タイマーイベント:doWorkがで呼び出されたとき、私は、経験しています限りJavaの私はここにこのタイマーを持って

public void doWork() throws JMSException { 
    String fileContent = getFileContent(); 
    Session session = queue.getConnection().createSession(false, Session.AUTO_ACKNOWLEDGE); 

    Destination dest = session.createQueue(queue.getName()); 
    MessageProducer producer = session.createProducer(dest); 
    TextMessage message = session.createTextMessage(); 

    //Different and not less than to be able to create permanent producers 
    for (int i = 0; i != numberOfMsgsInBurst; i++) { 
     message.setText(fileContent); 
     producer.send(message); 
    } 

    /* 
    * Send a non-text control message indicating end of messages. 
    */ 
    producer.send(session.createMessage());  
} 

:このコードを呼び出す

timer = new Timer(delay, new ActionListener() {   
     @Override 
     public void actionPerformed(ActionEvent e) { 
      try { 
       doWork(); 
      } catch (JMSException e1) { 
       e1.printStackTrace(); 
      }    
     } 
    }); 
    timer.start(); 

タイマー、それはシステム(例えば、GUI)をブロックする。私はこのdoWorkメソッドを永続的に(numberOfMsgsInBurstを-1に設定して)実行できるようにしたいので、プロデューサは永久にメッセージを生成します。 私が抱えている問題は、システムが応答を停止するようにシステムをブロックしていることです。

このイベントをバックグラウンドスレッドで発生させる方法はありますか?スレッド内

おかげで、 オスカー

答えて

2

javax.swing.Timer sイベントディスパッチスレッドでActionListenerコールバックを実行します。つまり、コードにすばやく戻る必要があります。そうしないと、GUIがフリーズします。

このタスクを別のスレッドで実行する場合は、代わりにjava.util.Timerクラスを使用することを検討してください。これは、doWorkが呼び出されるたびに新しいThreadを生成する(新しいThreadの作成は高価です)よりもクリーンでリソースの消費量が少なくなります。

+0

これはおそらく最適な方法です。私はjava.util.Timerについて知らなかった。 –

3

あなたは(doWorkを開始することができます):

public void actionPerformed(ActionEvent e) { 
    Thread t = new Thread() { 
     @Override 
     public void run() { 
      try { 
      doWork(); 
      } catch (JMSException e1) { 
      e1.printStackTrace(); 
      } 
     } 
    }; 
    t.start(); 
} 
+0

これは、イベントが発生するたびに新しいスレッドを開始するという欠点があります。そうでない場合は素晴らしい解決策です。 –

+0

真実ですが、私はOPを理解するので、doWork()はとにかく無限に走るかもしれません。 – morja

+0

はい、場合によっては無限に実行されることがあります(指定した回数の繰り返しまたは無限に実行する必要があるかどうかをユーザーが定義できます) – JSBach

0

私はいくつかのイベントオブジェクトの(LinkedBlockingQueueが良い例です)、同期キューを作成します。次に、タイマーイベントは単にオブジェクトをキューに入れ、処理スレッドはキューからオブジェクトを取得し、次のオブジェクトが利用可能なときに処理を行います(take()は自動的に待機します)。

関連する問題