2013-03-08 1 views
1

나는 모든 것을하려고하는 중 하나가 매우 바쁜 스레드를 가지고 있으며, 내 MouseMotionListener 속도를 늦추기 시작했습니다. 나는 빨리이 할 수있는 한 항상 실행의 확인하기 위해 다른 스레드에서 리스너를 넣어 것이라고 생각하지만, 곧 내가 만든로 : 나는 깨달았다 Java의 다른 스레드에 MouseMotionListener를 추가 할 수 있습니까?

import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 

public class MouseListenerThread extends Thread implements MouseMotionListener { 

    public void run(){ 
     //Concurrency happens here 
    } 

    public void mouseDragged(MouseEvent e) { 
     // Do something 
    } 

    public void mouseMoved(MouseEvent e) { 
     // Do something else 
    } 
} 

이 나는 ​​등이 다른 객체의 기능을 가질 수있는 동안 마우스 수신기, 나는 동시에 그것을 할 수 없었다. 듣기를 위해 실행 기능을 사용할 수있는 방법이 있습니까? 나는 청취자의 속도를 높이기위한 다른 해결책도 받아 들일 것이다.

감사합니다.

+2

스윙에서 이벤트 발송 스레드에서 오랫동안 실행하지 않아야합니다. 매우 바쁜 스레드는 작성한 다른 스레드 여야합니다. 마우스 수신기는 이벤트 발송 스레드에서 호출되므로 두 스레드가 서로 간섭하지 않아야합니다. – sjr

+1

'EDT'에 영향을주는 프로세스가 있다면, 그 기능을'SwingWorker'에 넣는 것을 고려해보십시오. 'MouseListeners'는'EDT'에서만 찾을 수 있습니다. – Reimeus

+0

두 클래스를 바꾸고 모든 사업을 대체 스레드로 옮기고 모든 마우스의 위치를 ​​청취하도록 하시겠습니까? – user1706538

답변

4

mouseDragged 등을 수신하는 실제 수신기는 이벤트 발송 스레드 (EDT)에 있어야합니다. 이러한 이벤트 처리 메소드에서 수행되는 "비 GUI"작업은 SwingWorker 또는 다른 스레드 스레딩 메소드를 사용하여 다른 스레드에 적용될 수 있습니다.

모든 GUI 작업은 이벤트 발송 스레드에 있어야하므로 GUI 처리로 인해 이벤트 처리기가 느려지는 경우 문제가 될 수 있지만 SwingUtilities.InvokeLater을 사용하면 모든 스레드가 EDT 스레드에 대한 일정을 잡을 수 있습니다 . InvokeAndWait을 사용할 수도 있지만 GUI가 매우 단단히 연결된 상태입니다.

+0

하하, 그건 그렇습니다. 큰 for 루프를 가진 많은 집중적 인 것들은 다른 곳에 쉽게 배치 될 수 있습니다. 따라서이 작업이 그림과 마우스 청취에 거의 아무것도하지 않을 때, 예상 한만큼의 효과가 있습니다. – user1706538

+2

'모든 GUI 작업은 주 스레드에 있어야합니다. '-> 주 스레드는 GUI 스레드 (EDT)와 다릅니다. –

+0

100 % 참. 결정된. – John3136

2

모든 이벤트는 이벤트 발송 스레드에 의해 발송됩니다. 마우스 메서드를 다른 스레드에 배치하면 이벤트 메서드가 EDT의 컨텍스트 내에서 알림으로 처리되므로 아무런 차이가 없습니다.

스윙은 단일 스레드 프레임 워크입니다. 즉, UI와의 모든 상호 작용은 EDT 컨텍스트 내에서 실행되어야합니다. 따라서 다른 스레드에 작업을로드 할 수없는 경우에도 EDT로 UI의 변경/업데이트를 다시 동기화해야합니다.

자세한 내용은 Concurrency in Swing을 읽어 보시기 바랍니다. 당신은 EDT 내에서 작업을 차단/실행 오랫동안 실행하는 경우

, 유는 별도의 스레드에서 작업을 실행할 수 있도록하는 SwingWorker를 사용하는 것을 고려하고자하지만, UI

업데이트하는 프로세스를 단순화하기위한 방법을 제공 할 수있다
관련 문제