2010-02-16 7 views
11

java.util.concurrent 패키지 및 Future 인터페이스를 참조하여 오랜 시간 작업을 시작하고 진행은 SwingWorker 구현 클래스에서만 제공됩니다.미래에 진행을 얻을 수있는 능력 <T> 개체

이가 다음과 같은 질문 구걸 : 비 GUI, 비 스윙 응용 프로그램에서

방법이 있나요 (이미징 콘솔 응용 프로그램) 백그라운드에서 긴 작업을 시작하고 다른 스레드가 검사 할 수 있도록를 진행 ? 이 기능이 스윙/GUI 응용 프로그램에 제한되어야하는 이유는 없습니다. 그렇지 않으면, 내가 볼 수있는 유일한 옵션은 ExecutorService :: submit을 통해 Future 객체를 반환하는 것입니다. 그러나 기본 Future 인터페이스는 진행 상황을 모니터링 할 수 없습니다.

+2

참조 http://stackoverflow.com/questions/2003354/how-can-i-report-progress-from-a-background-task – Mark

답변

5

분명히 Future 개체는 차단 한 다음 결과를 수신하는 데 적합합니다.

제출 한 Runnable 또는 Callable 객체는이 진행률 (완료율, 시도 횟수, 상태 (enum?) 등)을 제공하고 객체 자체에 대한 API 호출로 제공하는 방법을 알고 있거나 일부 조회 리소스 (메모리 맵 또는 필요한 경우 데이터베이스에 있음)에 게시됩니다. 간단히하기 위해 객체 자체를 좋아하는 경향이 있습니다. 특히 객체 또는 객체 자체에 대한 참조를 조회 할 핸들 (id)이 필요할 가능성이 높습니다.

이것은 3 개의 스레드가 작동하고 있음을 의미합니다. 실제 작업에는 1, 결과를 기다리는 동안 차단 된 1 및 모니터링 스레드 인 1입니다. 마지막 요구 사항은 요구 사항에 따라 공유 될 수 있습니다.

1

클라이언트 프로그램이 모든 것을 올바르게 조정하고 동기화하는 것에 대해 걱정할 필요없이 장기 실행 작업의 진행 상태를 업데이트하기 위해 표준 동시성 프레임 워크 방식이 있었으면합니다. 그것은 내게는 isDone()get() 메소드 이외에 public short progress();을 지원하는 Future<T> 인터페이스의 확장 버전을 짐작할 수있는 것으로 보입니다. 이 사람이 갈 귀찮게 왜의 질문을 구걸

public interface CanReportProgress { 
    public short progress(); 
} 

: 은 분명히 progress()의 구현은 직접 그래서 아마 Future<T>CanReportProgress는 다음과 같은 인터페이스입니다 Future<T extends CanReportProgress>로 지정 될 필요가 오브젝트를 폴링해야 Future 개체를 통해 개체 자체를 호출하여 진행률을 얻습니다. 나는 모른다. 나는 그것을 더 생각해야 할 것이다. ExecutorService::submit/execute에 대한 호출 후에 클라이언트 프로그래머가 Callable 개체 자체가 다시 액세스하지 못하게하는 현재 계약/의미에 더 가깝다고 주장 할 수 있습니다.

+0

JDK 상자에서 도움이되는 내용을 모르겠습니다. SwingWorker (1.6 JDK의 일부)를 비 Swing 버전이 어떻게 보일지를 보여주는 예로 삼는 것 외에도 많은 것들이 있습니다. 그것은 RunnableFuture 과 getProgress() (이벤트 알림 포함)를 사용합니다.이것은 알려진 양이고 더 큰 마음으로 수년간 개발/테스트를 받고 있기 때문에 내게 솔리드 한 시작처럼 들립니다. 행운을 빌어 요. – Matt

+3

미래의 T는 은 반환 값의 클래스를 나타냅니다. 작업이 끝날 때까지 T에 액세스 할 수 없습니다. T가 CanReportProgress를 확장하는 것은 의미가 없습니다. – Anderson

1

내 경우에는 처리 할 개체가있는 HashSet을 매개 변수로 메서드에 전달했습니다.이 메서드는 호출 클래스에서 인스턴스 변수로 만들어졌습니다. 비동기 메소드가 처리 후 객체를 제거하면 호출 메소드에 남아있는 Map의 크기를 검색 할 수 있습니다. 일반적으로 참조로 객체를 전달하는 것은 문제를 해결합니다.

관련 문제