2010-12-23 4 views
5

안녕하세요, 초심자인데 순진한 소리가 들리면 제 질문에 대해 미안합니다.자바의 기본 프로그램 백그라운드에서 이벤트 리스너를 구현하는 방법은 무엇입니까?

백그라운드에서 실행되는 스레드를 구현하고 항상 듣고 싶습니다. 듣는 것은 말하자면, 메인 스레드에서 리턴 된 값을 체크하고, vue가 특정 수치를 초과하면, 어떤 메소드를 실행하거나, 프로그램을 종료한다고 말합니다.

나에게 아이디어를 줄 수 있거나 적어도 유용한 것을 알려줄 수 있다면 큰 도움이 될 것입니다.

답변

2

처리를 낭비 할 수 있으므로이 스레드가 루프에서 실행되어 값을 계속 폴링하지 못하게해야합니다.

이상적으로, 값이 변경되면 리스너에게 알림이 전송되는 것이 이상적입니다. 이는 모니터 된 값을 수정하는 코드가 특별한 메소드를 호출 할 것을 요구합니다. 리스너가 별도의 스레드에서 실행될 필요는 없습니다. 그것은 청취자가 통지받을 때 무엇을하는지에 달려있다.

값을 수정하는 코드를 변경할 수없는 경우 간격을두고 값을 확인하는 것이 가장 좋습니다. 일정 기간 동안 값이 여러 번 변하기 때문에 변경 사항이 즉시 나타나지 않을 수 있습니다.

다음 중 가장 적합한 상황에 맞는 솔루션을 선택해주세요.

+0

당신의 대답에 감사드립니다. 처음에는 루프를 구현할 생각이었습니다. 사실 저는 윈도우 명령 행을 통해 외부 프로세스를 실행하고 있습니다. 그리고 그 대가로 나는 추적을 유지할 필요가있는 값을 읽습니다. String 형식의 응답을 받고 int를 사용하여 체크를 적용합니다. Runtime.getRuntime(). exec()를 통해이 외부 프로세스를 계속 호출하여 반복적으로 호출하고 매 2 초마다 정기적으로 값을 확인합니다. msec에 민감하지 않습니다. 이렇게하는 것이 현명한 생각이라고 생각합니까? –

+0

@Sara - 당신의 계획은 그것을 다루는 적절한 방법으로 들립니다. ['ScheduledExecutorService'] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html)에서이 검사를 실행할 스레드를 만드는 것이 좋습니다. 고정 된 간격. – erickson

+0

[이 StackOverflow 질문] (http://stackoverflow.com/questions/426758/running-a-java-thread-in-intervals) 및 허용 된 대답은'ScheduledExecutorService'를 사용하는 좋은 예를 제공합니다. – erickson

1

Java Tutorials에서 스레드 사용에 대한 정보를 찾을 수 있습니다 (Java에서 동시성을 처음 사용하는 경우이 자습서를 먼저 읽는 것이 좋습니다). 특히 this section이 유용 할 수 있습니다 (새 스레드를 만들고 시작하는 방법을 보여줍니다).

+0

대단히 감사합니다. 정말 도움이되었습니다. –

0

난 당신이 단순히 다음 처리에 대한 이벤트를 읽고 텍스트 필드 입력 값의 상태 변화를들을 쉽게 할 수, JTextField로 같은 메인 쓰레드위한 GUI 구성 요소를 사용할 수있는 것 같아요.

+0

GUI 개체를 인스턴스화하여 필요하지 않은 작업을 낭비하지 않으려합니다. 나는 단순한 해결책을 찾고 있습니다. –

+0

그러면 rodion의 대답을 볼 수 있습니다. – Ahmed

1

다른 스레드에서 결과를 폴링하기 만하면 @Piotr에서 제안한대로 java.util.concurrent 패키지를 사용해보십시오. 구체적인 예를 들어 보면 다음과 같습니다.

import java.util.concurrent.*; 

class Main{ 
    public static void main(String[] args) throws Exception{ 
     //Create a service for executing tasks in a separate thread 
     ExecutorService ex = Executors.newSingleThreadExecutor(); 
     //Submit a task with Integer return value to the service 
     Future<Integer> otherThread = ex.submit(new Callable<Integer>(){ 
      public Integer call(){ 
       //do you main logic here 
       return 999;//return the desired result 
      } 
     } 

     //you can do other stuff here (the main thread) 
     //independently of the main logic (in a separate thread) 

     //This will poll for the result from the main 
     //logic and put it into "result" when it's available 
     Integer result = otherTread.get(); 

     //whatever you wanna do with your result 
    } 
} 

희망이 있습니다.

관련 문제