2012-06-05 2 views
1

새 스레드에서 작업을 보내고 싶습니다.이 작업을 통해 다양한 단계의 실행 중에 부모 스레드에 알리고 싶습니다. 아래에 표시된 것과 같습니다 :부모 스레드와 통신 할 수있는 새 스레드에서 작업을 디스패치합니다.

void unzip(Path source, Path destination, ObserverThread observer) { 
    int n = compute number of entries; 
    observer.notify("n: " + n); 
    while (there are more entries) { 
    observer.notify("Unzipping " + name of entry); 
    unzip the entry; 
    } 
    observer.notify("done"); 
} 

이 사용 사례에 대한 표준 라이브러리 전용 솔루션은 무엇이 될까요? (외부 종속성을 원합니다.)

답변

1

Swing에서 이것을 사용하는 경우 SwingWorker (Java의 일부)을 사용해야합니다. 백그라운드에서 작업하는 동안 how to publish interim results에 대한 예가 있습니다.

스윙을 사용하지 않는 경우 표준 자바는 Executors 클래스와 함께 제공됩니다. 단일 스레드 ExecutorService을 생성하고 Runnable을 제출할 수 있습니다. 진행중인 결과를 게시하는 방법은 제공하지 않지만 예제에 표시된 것처럼 직접 콜백을 수행 할 수 있습니다.

+0

중간 결과를 게시하는 링크가 유용했습니다. 고맙습니다! – missingfaktor

+0

이것은 원래 질문에 대답하지 않습니다. 'SwingWorker'의'publish'와'process'는'protected'입니다. 그것과 그것의 아키텍처는 'SwingWorker'안에 모든 로직을 넣도록 강요합니다. – missingfaktor

+0

논리는 자신의 클래스에 있지만 SwingWorker를 확장해야합니다. 게다가 당신은 SwingWorker에'addPropertyChangeListener'를 할 수 있으며, 진행이 이루어 지거나 자신의 이벤트를 시작할 때 청취자에게 통보됩니다. – Andrejs

1

한 가지 가능한 방법은 blocking queue of sorts을 사용하는 것입니다. 부모는 주기적으로 poll하거나 새로운 메시지를 수신하기 위해 대기열에서 peek 큐에 대한 것 단순히 add의 메시지

은 "아이"스레드 (이 등, 이벤트를 수신, 말, 어쨌든 않습니다 어떤 산재) 것 , 부모가 적시에 그들을 제거한다고 가정합니다.

부모와 자식 스레드가 병렬로 실행되어야한다고 가정합니다. 즉, 자식 스레드로부터 새 메시지가 도착할 때까지 부모 스레드가 차단할 수 없습니다. 즉, 별도의 자식 스레드가있는 지점은 무엇입니까? 어쨌든 그 사건.

차단 대기열을 사용하면 부모가 사용할 수있는 것보다 더 빨리 메시지를 생성하더라도 메모리 사용량이 제한되어 있고 부모가 마침내 관리 할 때까지 어떤 시점에서 대기해야합니다. 다시 대기열에 방을 만들 수 있습니다.

또 다른 방법은 부모가 메시지를 충분히 소비 할 수 없을 때 메시지를 삭제하는 것입니다.

+0

이것은 내 취향에 너무 복잡하기 때문에 Java의 동시성 추상화에서 초보자입니다. 그래도 고마워. – missingfaktor

관련 문제