Java (java.util.concurrent)의 스레드 풀을 구현해야합니다.이 스레드 풀은 유휴 상태 일 때 최소값을 가지며 상한까지 증가하지만 작업이 완료 될 때보 다 더 빨리 작업에 제출되고 모든 작업이 완료되고 더 이상 작업이 제출되지 않을 때 하한으로 축소됩니다.동적 (확장/축소) 스레드 풀 만들기
어떻게 구현합니까? 이것은 꽤 일반적인 사용 시나리오 일 것이라고 생각하지만 분명히 java.util.concurrent.Executors
팩토리 메소드는 많은 작업이 제출 될 때 무한정 증가하는 고정 크기 풀과 풀만 생성 할 수 있습니다. ThreadPoolExecutor
클래스는 corePoolSize
및 maximumPoolSize
매개 변수를 제공하지만 문서에서는 corePoolSize
개 이상의 스레드를 동시에 가질 수있는 유일한 방법은 바운드 작업 큐를 사용하는 것입니다.이 경우 바운드 작업 큐를 사용하는 경우 maximumPoolSize
개의 스레드에 도달 한 경우, 너 자신을 다루어야하는 직업 거부를받을거야? 나는 이것을 생각해 냈다 :
//pool creation
ExecutorService pool = new ThreadPoolExecutor(minSize, maxSize, 500, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(minSize));
...
//submitting jobs
for (Runnable job : ...) {
while (true) {
try {
pool.submit(job);
System.out.println("Job " + job + ": submitted");
break;
} catch (RejectedExecutionException e) {
// maxSize jobs executing concurrently atm.; re-submit new job after short wait
System.out.println("Job " + job + ": rejected...");
try {
Thread.sleep(300);
} catch (InterruptedException e1) {
}
}
}
}
나는 무엇인가 내려다 본다? 이 작업을 수행하는 더 좋은 방법이 있습니까? 또한 요구 사항에 따라 위 코드가 적어도 (total number of jobs) - maxSize
작업이 완료 될 때까지 완료되지 않을 수도 있습니다. 따라서 풀에 임의의 수의 작업을 제출하고 완료 할 때까지 기다리지 않고 즉시 진행할 수 있기를 원한다면 어떻게 관리 할 수있는 전용 "작업 정리"스레드가 없어도이를 수행 할 수있는 방법을 알 수 없습니다 제출 된 모든 작업을 보관 유지하는 필수 unbounded 큐 AFAICS, ThreadPoolExecutor 자체에 대해 무한 대기열을 사용하는 경우 해당 스레드 수가 corePoolSize 이상으로 커지지 않습니다.
나는 동적 크기의 스레드 풀의 유용성을 보지 못한다는 것을 인정해야한다. 응용 프로그램의 가동 시간 동안 보드의 프로세서 수가 변경됩니까? – corsiKa
'newCachedThreadPool'이 상황에 맞지 않는 이유는 무엇입니까? 더 이상 사용되지 않는 스레드는 자동으로 제거됩니다. – Tudor
유휴 스레드가 죽지 않았다면 어떻게 될까요? 항상 최대 크기의 고정 크기 풀을 가지고 있다고 가정 해보십시오. 무슨 일이 일어날 지? –