Java - обработка событий таймера в фоновом потоке - PullRequest
0 голосов
/ 16 декабря 2010

У меня есть этот таймер здесь:

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

Называется этот код:

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());     
}

Насколько я понимаю, когда doWork вызывается таймером, он блокирует систему (например, GUI). Я хочу иметь возможность постоянно запускать этот метод doWork (устанавливая для numberOfMsgsInBurst значение -1), чтобы производитель постоянно создавал сообщения. Проблема в том, что она блокирует систему, поэтому система перестает отвечать на запросы.

Можно ли как-нибудь запустить это событие в фоновом потоке?

Спасибо, Оскар

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

Вы можете запустить doWork () в потоке:

 public void actionPerformed(ActionEvent e) {
    Thread t = new Thread() {
        @Override
        public void run() {
           try {
             doWork();
           } catch (JMSException e1) {
             e1.printStackTrace();
           }
        }
    };
    t.start();
}
2 голосов
/ 16 декабря 2010

javax.swing.Timer s выполняет обратный вызов ActionListener в потоке диспетчеризации событий.Это означает, что ваш код должен возвращаться быстро, иначе графический интерфейс будет зависать.

Если вы хотите запустить эту задачу в другом потоке, вы можете вместо этого использовать класс java.util.Timer.Это будет чище и менее ресурсоемко, чем порождение нового Thread каждый раз, когда вызывается doWork (создание нового Thread s стоит дорого).

0 голосов
/ 16 декабря 2010

Я бы создал синхронизированную очередь (LinkedBlockingQueue - хороший пример) некоторых объектов событий. Затем событие таймера просто помещает объект в очередь, а поток обработки извлекает объекты () из очереди и выполняет обработку, когда следующий объект доступен (take () ожидает его автоматически).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...