나는 보고서의 실행을 변경하고 동시에 수행하도록하고있다. 'serail mode'에서 실행 테스트는 30 초가 걸리며 동시 모드를 사용할 때는 27 초가 걸릴 것입니다. 직렬로 수행해야하는 몇 가지 단계를 수행해야하며 결과가 좋을 것입니다.왜 newFixedThreadPool의 증가로 인해 성능이 저하됩니까?
난 아직도하지 않는 것은이 라인 :
내 컴퓨터가 2x2.6 GHz의 쿼드 코어로 무장하고 인 newFixedThreadPool가 높은 경우 나 실행 시간이 감소 할 것으로 기대ExecutorService executor = Executors.newFixedThreadPool(4);
(16). 사실, newFixedThreadPool을 늘리면 실행 속도가 느려집니다. 이것은 질문을 구걸한다 : 나는 무엇을 잘못하고 있는가, 또는 무엇을 이해하지 못하는가?!?!
내 실행 결과 스크린 샷 2 장을 포함하고 있습니다.
A.의 newSingleThreadExecuter - 23 초
B. 인 newFixedThreadPool에서 실행 (4) - 43 초에서 실행.
'Worker'를 제출할 때마다 system.out에 currentTimeMillis가 표시되고 "fatched tkt"결과는 db에서 데이터를 가져 오는 데 걸리는 밀리 초입니다. (전략 A에서는 ~ 3ms, B에서 최대 7ms). 당신이 작업에 스레드를 추가하는 경우
Stopper stopper = new Stopper();
for (Long iNum : multimap.asMap().keySet())
{
List<Long> tickets = (List<Long>) multimap.get(iNum);
for (Long ticketNumber : tickets)
{
pojoPks = getPkData(iNum);
Callable<PojoTicket> worker = new MaxCommThread(ticketNumber, pojoPks);
Future<PojoTicket> submit = executor.submit(worker);
futures.add(submit);
}
}
System.out.println("futurues: " +futures.size());
for (Future<PojoTicket> future : futures)
{
try
{
PojoTicket pojoTicket = future.get();
//do the rest here
} catch (InterruptedException e)
{
System.out.println("---------------------->InterruptedException");
} catch (ExecutionException e)
{
System.out.println("---------------------->ExecutionException");
}
}
executor.shutdown();
stopper.stop();
는
어. 왜 많은 ExecutionException이 발생합니까? – Gray
Worker 클래스 코드를 게시 할 수 있습니까? 그것은 일어나는 일에 대해 더 많은 단서를 줄 수 있습니다. –