2010-12-16 4 views
0

백그라운드 스레드에서 처리 타이머 이벤트 : doWork가 호출 될 때 내가 경험하고 마찬가지로 지금까지자바 내가 여기이 타이머가

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로 설정하여) 실행할 수 있기를 바란다. 그래서 생성자는 영구적으로 메시지를 생성 할 것이다. 문제는 시스템을 차단하여 시스템이 응답을 멈추는 것입니다.

이 이벤트를 백그라운드 스레드에서 실행할 수있는 방법이 있습니까?

덕분에, 오스카

당신은 스레드의 doWork()을 시작할 수 있습니다

답변

2

javax.swing.Timer 이벤트 처리 스레드에서 ActionListener 콜백을 실행합니다. 즉, 코드 으로 빨리 반환되어야하며, 그렇지 않으면 GUI가 멈 춥니 다.

이 작업을 다른 스레드에서 실행하려면 java.util.Timer 클래스를 사용하는 것이 좋습니다. doWork이 호출 될 때마다 새 Thread을 생성하는 것보다 더 깨끗하고 자원 집약적입니다 (새 Thread을 만드는 데 비용이 많이 듭니다).

+0

아마도 가장 좋은 방법 일 것입니다. 나는 java.util.Timer에 대해 몰랐다. –

3

는 :

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()가 자동으로 대기)합니다.

관련 문제