मुझे लगता है कि इस समस्या को वर्ग के एक कमी है और बहुत निर्माता पैरामीटर संयोजन दिए गए भ्रामक है। यहां स्विंगवर्कर के आंतरिक थ्रेडपूलएक्सएटर से लिया गया एक समाधान है जिसे मैंने शीर्ष स्तर की कक्षा में बनाया है। इसमें न्यूनतम नहीं है लेकिन कम से कम ऊपरी बाउंड का उपयोग करता है। एकमात्र चीज जो मुझे नहीं पता वह लॉकिंग निष्पादन से आपको क्या प्रदर्शन मारा जाता है।
public class BoundedThreadPoolExecutor extends ThreadPoolExecutor {
private final ReentrantLock pauseLock = new ReentrantLock();
private final Condition unpaused = pauseLock.newCondition();
private boolean isPaused = false;
private final ReentrantLock executeLock = new ReentrantLock();
public BoundedThreadPoolExecutor(int maximumPoolSize,
long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(0, maximumPoolSize, keepAliveTime, unit, workQueue);
}
public BoundedThreadPoolExecutor(int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
super(0, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory);
}
public BoundedThreadPoolExecutor(int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
super(0, maximumPoolSize, keepAliveTime, unit, workQueue,
handler);
}
public BoundedThreadPoolExecutor(int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
super(0, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, handler);
}
@Override
public void execute(Runnable command) {
executeLock.lock();
try {
pauseLock.lock();
try {
isPaused = true;
} finally {
pauseLock.unlock();
}
setCorePoolSize(getMaximumPoolSize());
super.execute(command);
setCorePoolSize(0);
pauseLock.lock();
try {
isPaused = false;
unpaused.signalAll();
} finally {
pauseLock.unlock();
}
} finally {
executeLock.unlock();
}
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
pauseLock.lock();
try {
while (isPaused) {
unpaused.await();
}
} catch (InterruptedException ignore) {
} finally {
pauseLock.unlock();
}
}
}
स्रोत
2010-03-31 16:01:36
आपका क्या मतलब है कि यह काम नहीं करता है? एक अपवाद? – Gandalf
जो कि बहुत करीब है: Gandalf और Sarmun! – akf
एंट्स यहां किसी भी मिनट होना चाहिए। । । और वह अजीब ईगल कहाँ है ... – Gandalf