2011-12-09 3 views
9

XSEDE 리소스 중 하나에서 게놈 어셈블리 프로그램 * Trinity, http://trinityrnaseq.sourceforge.net/ (관심이 있다면)을 실행 중입니다. 하드웨어는 스레드 수를 2500으로 제한합니다.이 프로그램은 항상 초과하는 스레드 수를 제한합니다. 실행되는 스레드 수를 제한하는 쉬운 방법은 무엇입니까? -XX:ParallelGCThreads=16을 시도했지만 새로운 오류가있는 것 같습니다.런타임시 Java 쓰레드 수를 어떻게 제한 할 수 있습니까?

그래서 전체 스레드 수를 제한하는 런타임 명령이 있습니까 ??

+4

문제는 JVM에게 스레드 수를 제한 할 수 있다고하더라도 트리니티 응용 프로그램 논리는 여전히 더 많은 스레드를 확보하려고 시도하므로 런타임에 실패 (또는 차단)됩니다. 다른 포크/스레드 생성 전략을 사용하기 위해 Trinity 코드베이스를 패치하고 싶은 것처럼 보입니다. 소스 코드를 가져 와서 변경하면됩니다. –

+0

Trinity docs를 건너 뛰고 --CPU 옵션을 보았습니다. 너 그거 해봤 니? – user949300

+0

Trinity docs를 건너 뛰고 --CPU 옵션을 보았습니다. 너 그거 해봤 니? – user949300

답변

0

스레드 제한 수를 처리하는 별도의 프로세스로 실행되는 사용자 지정 큐를 사용할 수 있습니다. 이것의 장점은 스레드를 제한하거나 여전히 스레드 수를 계속 유지할 수 있다는 것입니다. addToQueue(Thread t) 클래스가 있고 이후에 이러한 모든 스레드를 소비하는 소비자가있을 것입니다. 큐는 실제로 실행중인 스레드 수를 알 수 있습니다. 데몬 프로세스는 스레드가 범위 내에 있으면이 대기열의 consume() 메소드를 실행합니다. 모든 스레드가 작업을 마쳤거나 강제 실행 한 후에 대기열로 다시보고합니다. 실행중인 작업에 우선 순위가 있어야한다고 생각하면 유지 관리하는 대기열이 우선 순위 대기열이 될 수 있습니다. 이것은 JVM에 대한 의존성을 제거 할뿐만 아니라 프로그램을 더 깨끗하게 보입니다.

2

Executor 또는 ExecutorService를 사용하십시오. bragboy가 제안하지만 Java에 내장되어 있습니다.

관련 문제