현재 이전 프로그램을 멀티 스레드하려고합니다. 아래 코드는 다음과 같습니다.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 개의 스레드가 실행될 것으로 예상됩니다. 대신에, 각각 하나를 실행하고 그것이 즉시 완료되고 스레드 풀의 다음 스레드를로드한다고 말합니다. 그래서 나는 동시에 실행하려고하는 수백 개의 스레드가 남아 있습니다.
어떤 일이 벌어지고 있는지 알 수 있습니까?
JVisualVM과 같은 도구로 스레드 동작을 보는 것이 도움이 될 것이라고 생각합니다. 어쩌면 쓰레기 더미? 아마도 run() 메소드를 보는 것도 도움이 될 것입니다. – jambriz
대신 더미 제출을 시도 했습니까? 그냥 Thread.sleep (언젠가) 그것으로? – Fildor
그래서'DipoleSimple.run()'메소드를 평가하는 데 3 분이 걸립니까? 코드가 잘 보이기 때문에 다른 일이 일어나지 않을 것이라고 확신합니다. 'DipoleSimple' 클래스 샘플을 게시 할 수 있습니까? – Gray