2013-04-25 3 views
2

현재 이전 프로그램을 멀티 스레드하려고합니다. 아래 코드는 다음과 같습니다.runnable run() 함수가 즉시 종료됩니다.

public class DipoleTester { 
    public static String DIR = "/home/"; 
    public static void main(String[] args) throws InterruptedException { 
    Dipole trial; 
    ExecutorService service = 
     Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 
    for (int r = 10; r < 150; r += 1) { 
     double radius = (double) r/10000.0; 
     for (int matType = 0; matType < 3; matType++) { 
     String name = matType + "_rad" + radius; 
     trial = new DipoleSimple(DIR, name); 
     trial.materialType = matType; 
     trial.RADIUS = radius; 
     service.submit(trial); 
     } 
    } 
    service.shutdown(); 
    service.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS); 
    } 
} 

꽤 간단한 프로그램입니다. run()은 main() 메소드였던 꽤 기본적인 메소드입니다. 평균적으로 평가하는 데 약 3 분이 걸립니다. 문제는 여기에서 run()에 비동기 호출을하는 것처럼 보이기 때문에 전체 스레드 풀을 즉시 평가할 수 있기 때문입니다.

즉, 3-5 분 안에 병렬로 8 개의 스레드가 실행될 것으로 예상됩니다. 대신에, 각각 하나를 실행하고 그것이 즉시 완료되고 스레드 풀의 다음 스레드를로드한다고 말합니다. 그래서 나는 동시에 실행하려고하는 수백 개의 스레드가 남아 있습니다.

어떤 일이 벌어지고 있는지 알 수 있습니까?

+0

JVisualVM과 같은 도구로 스레드 동작을 보는 것이 도움이 될 것이라고 생각합니다. 어쩌면 쓰레기 더미? 아마도 run() 메소드를 보는 것도 도움이 될 것입니다. – jambriz

+1

대신 더미 제출을 시도 했습니까? 그냥 Thread.sleep (언젠가) 그것으로? – Fildor

+1

그래서'DipoleSimple.run()'메소드를 평가하는 데 3 분이 걸립니까? 코드가 잘 보이기 때문에 다른 일이 일어나지 않을 것이라고 확신합니다. 'DipoleSimple' 클래스 샘플을 게시 할 수 있습니까? – Gray

답변

0

귀하의 코드는 괜찮 은데, 나는 그것을 테스트하기 위해 샘플을 다음과 같은 시도 :

System.out.println("Available Processors: "+Runtime.getRuntime().availableProcessors()); 
     ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 
     final AtomicInteger ai = new AtomicInteger(); 
     for(int i=0; i<10; i++) { 
      es.submit(new Runnable() { 
       public void run() { 
        System.out.println(Thread.currentThread().getName()+"_"+ai.incrementAndGet()); 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 
     System.out.println("shutting down"); 
     es.shutdown(); 
     System.out.println("shutdown"); 
     es.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS); 
     System.out.println("Completed"); 

샘플 출력을 (4 가능한 프로세서를 고려) :

Available Processors: 4 
pool-1-thread-2_1 
pool-1-thread-3_3 
pool-1-thread-4_4 
pool-1-thread-1_2 
shutting down 
shutdown 
pool-1-thread-2_5 
pool-1-thread-4_6 
pool-1-thread-3_7 
pool-1-thread-1_8 
pool-1-thread-2_9 
pool-1-thread-4_10 
Completed 

shutdown 후 추가 시험을 제출하지 않기 때문에 shutdown 완료 전에 제출 된 10 개의 모든 스레드를 볼 수 있으므로 제출 된 모든 시험판이 처리되어야합니다. run 메서드 완료 로그/문을 로깅하여이를 확인할 수 있습니다. 또한 실제 코드를 실행할 때 run 메서드가 각 스레드에 의해 얼마나 많은 시간을 사용하고 있는지 시간 로그를 추가 할 수 있는지 분석하는 것이 도움이됩니다.

+1

'shutdown'은 실행중인 쓰레드를 인터럽트하지 않습니다. – jtahlborn

+0

@jtahlborn 이것을 지적 해 주셔서 고맙습니다. 맞습니다.'ThreadPoolExecutor.shutdown'의 내부 주석에 따라 내부적으로'getTask'에서 차단 될 수있는 작업자 스레드에 대해 중단이 발생합니다. 내 답변을 수정했습니다. – harsh

+1

종료는 제출할 추가 작업을 중지합니다. 제출 된 모든 작업이 실행됩니다. – Gray

관련 문제