2016-07-24 3 views
0

ExecutorService에서 특정 코스 ID를 처리하는 모든 스레드를 그룹화 한 다음 해당 스레드 ID에서 해당 스레드 ID를 처리하는 다른 스레드를 모두 닫으면 어떻게 처리 할 수 ​​있습니까?ExecutorService의 그룹 스레드

한 스레드 완료 프로세스까지 코스 ID를 처리 할 수있는 스레드 수는 고정되어 있지 않습니다.

업데이트 :

그래서 어떤 스레드가이 과정을 처리하기 위해 입력, 나는 정적 컬렉션에 추가 할 예정이다.

는 코스 상태가 완료 참조 thread1 그런 다음 한 번, thread1이 진행되는 동안

List l1 = new ArrayList(); 
l1.add(thread1); 

Map t = new Hashmap(); 
t.add("courseid1":l1) 

그래서 다른 스레드가 courseid1을 처리하기 위해 오는, 처음 thread1 처리, courseid1에 대한

l1.add(thread2); 

을 가정 나는 목록 l1에있는 모든 쓰레드에 성공을 보낼 것이다.

+0

미래의 유언장 작성자는 '취소'방법을 통해이를 수행 할 수 있습니다. 물론 일종의 작업 레지스트리를 유지해야 할 것이므로 취소 할 항목을 알고 있어야합니다. – mszymborski

답변

2

나는 parallelStream을 사용합니다.이 작업이 실패하거나 첫 번째 결과를 원할 경우 모든 작업이 중지됩니다.

Optional<Result> res = tasks.parallelStream().map(t -> process(t)).findFirst(); 
+0

감사합니다. 나는 java 8에서이 parallelStream에 익숙하지 않다. 어떤 식 으로든, 당신은 어떤 코드가 task 변수의 타입이고 어떤 것이 매핑인가, ok는 현재이 과정을 처리하고있는 모든 쓰레드인가? 샘플 코드 라인을 더 자세히 설명 할 수 있다면 많이 감사하겠습니다. – Harshana

+0

@Harshana'tasks'는 스레드가 수행하기를 원하는 모든 동작의 목록이고'process'는 호출 할 메서드입니다. –

+0

'process'는 부작용이없는 순수 함수 여야합니다. 또한이 솔루션을 사용하여 스레드 수를 어떻게 구성 할 수 있습니까? – Dici