나는 확실히 동시성 지옥에있어. 나는 내가하려고하는 것에 대한 좋은/효율적인 해결책을 찾을 수 없다. 텍스트 파일을 읽는 Producer 스레드를 공유 BlockedQueue 정보를 넣습니다. 그리고 공유 된 BlockedQueue를 사용하여 데이터를 읽는 소비자가 있으며 데이터로 무거운 것을 처리합니다. 나는 GUI가 세 버튼 : 시작, 일시 중지 및 중지입니다.생산자/소비자 관계를 시작, 일시 중지 및 중단하는 방법은 무엇입니까?
생산자와 소비자 나 생산자가 파일을 열고 자하는 시작 옵션을
(예를 들어, 통계 또는 일부 개체를 반환) Runnable를 구현하고 각각의 계산에 대한 정보에 액세스하는 방법을 제공 모두 BlockedQueue에 데이터를 넣기 시작합니다. 또한 소비자는 데이터를 가져 와서 계산을 시작합니다.
일시 중지 옵션 Producer가 BlockedQueue에 데이터를 저장하지 못하도록하고 싶지만 동시에 프로듀서의 인스턴스 변수에 액세스 할 수 있기를 원합니다. Consumer에 대해서도 마찬가지입니다. 무거운 것을 중단하고 싶지만 Consumer에서 정의 된 인스턴스 변수와 메소드에 액세스 할 수 있습니다.
옵션을 사용하면 생산자와 소비자가 다시 설정되도록 할 수 있습니다. 즉, 깨끗한 상태에서 시작하는 것처럼 말입니다.
제 질문은 이것을 효율적으로 구현하는 방법입니다. 특히 일시 중지를 확인 하시겠습니까?
이 psudo-code와 같은 것이 효율적입니까?
Enum state;
class Producer implements Runnable {
public List someList;//accessed from the event-dispatching thread
public void Run() {
synchronized(state) {
if(state == Enum.paused) {
//do nothing
}
else if(state == Enum.running) {
//put stuff into BlockedQueue
}
else if (state == Enum.stopped) {
// reopen file and set state = running
}
}
}
}
class Consumer implements Runnable {
public Map someMap;//accessed from the event-dispatching thread
public void Run() {
synchronized(state) {
if(state == Enum.paused) {
//do nothing
}
else if(state == Enum.running) {
//start consuming from the BlockedQueue and do heavy computation
}
else if (state == Enum.stopped) {
// clear stuff to start clean and set state = running
}
}
}
}
Sidenote : 열거 형을 일관되게 유지하십시오. 현재 상태 ('isPause')를 묘사하는 객체, 현재 동작을 묘사하는 객체 ('running'), 동작을 기술하는 객체 ('stop')가 있습니다. –
'독약 '을 들여다보십시오. –
이 질문은 Brian Goetz 등 7 장의 마케팅 캠페인처럼 들립니다. Java Concurrency in Practice. 이 장에서는 취소 가능성과 인터럽트 가능성을 다루며 "프로그램이 취소 및 종료를 처리하는 방법은 진정으로 강력한 동시 응용 프로그램을 단순히 작동하는 프로그램과 분리하는 요소 중 하나입니다"라고 설명합니다. Joshua Bloch의 Effective Java, 2nd Ed.보다 진보 된 읽기이지만, Java에서 심각한 동시 프로그래밍을하고자하는 사람들을 위해 반드시 읽어야합니다 (독극물을 다룹니다). – scottb