2012-03-05 2 views
0

루프가 {Loop-1}인데, 여기서 스레드를 시작합니다. {Loop-1}을 포함하는 클래스는 Daemon과 Runnable을 구현합니다. {Loop-1}에서 시작된 스레드는 coordinate() (ExecutorService를 사용하는 클래스 Coordinate.java) 클래스를 호출합니다. Coordinate.java의 객체가 생성됩니다Java : Callable을 사용한 ExecutorService : 동일한 풀을 루프에서 재사용 하시겠습니까? 셧다운이 필요합니까?

(이 {Loop-1} 전에 한 번 발생), 나는 Callable를 구현하는 클래스의 두 객체를 생성 coordinate()에서 ExecutorService입니다에게 pool = Executors.newFixedThreadPool(2);

를 인스턴스화하고 난 다음을 시작하고 결과를 저장 미래의 결과 목록. 나는 그런 result = future.get();

와 루프의 결과를 얻기 위해 시도 후, 나는 {Loop-1}로 돌아가서 전체 과정을 다시 시작 callableResults = pool.invokeAll(threads);

(coordinate(), invokeAll()를 호출

future.get() 지금 필자가있어 다음 질문에 답하십시오. 1. coordinate()에 결과를 얻은 후에 ExecutorService 풀을 종료해야합니까? 2. 내 {Loop-1}에를 호출 할 때마다 풀을 다시 만들어야합니까??

답변 해 주셔서 감사합니다. :-)

답변

1

처리 완료 후 executorService를 종료해야합니다. 모두 작업을 처리하십시오. 작업 제출은 여러주기가 될 수 있습니다.

executorService.shutDown()을 호출하면 executorService.awaitTermination(10, TimeUnit.SECONDS)을 사용하여 shutDown()을 호출 한 후 모든 작업이 완료 될 때까지 기다릴 수 있습니다.

다음과 같이 할 수도 있습니다. while (!executorService.isTerminated()) { }

+0

답변 해 주셔서 감사합니다! :-) – nano7

+2

이것은 못생긴 :'while (! executorService.isTerminated()) {}'. 완료되지 않은 작업이있는 동안 코어를 100 % 미치게 만들 것입니다! 'awaitTermination' 방법이 더 좋습니다. –

2

아니요. 고정 된 스레드 풀의 스레드는 shutdown을 호출 할 때까지 사용할 수 있습니다. 따라서 첫 라운드에서했던 것처럼 새로운 작업을 다시 제출하고 결과를 가져올 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. :-) – nano7