我正在使用ExcutorService
來提交併行運行的任務。任務的順序無關緊要。但是,服務可能會發生變化,特別是在請求的池的大小需要更改時。僅在單個入口點鎖定
public class Service {
private volatile ExecutorService service = Executors.newFixedThreadPool(4);
private final ReentrantLock serviceLock = new ReentrantLock();
public Future<Object> postRequest(final Callable<Object> request) {
try {
serviceLock.lock(); // ?
return service.submit(request);
} finally {
serviceLock.unlock(); // ?
}
}
public void setSize(final int size) {
try {
if (size <= 0) {
throw new IllegalArgumentException("service pool size must positive");
}
serviceLock.lock();
service = Executors.newFixedThreadPool(size);
} finally {
serviceLock.unlock();
}
}
}
很顯然,我不認爲我需要在postRequest
方法的鎖定和解鎖,當它被調用的唯一方法。
我只需要在訪問setSize
期間鎖定postRequest
。否則,鎖定和解鎖所需的額外時間毫無意義。我認爲這是必要的,因爲與提交的數百個請求相比,大小很少會改變(可能是一次或兩次)。
有沒有辦法在不需要時(setSize
未被訪問時)在postRequest
上避免鎖定?
如果OP想要一個'ThreadPoolExecutor'的功能,那麼OP應該創建一個類型的變量,並明確創建該類型的對象。使用類型轉換或其他方式來顛覆庫函數的意圖是一種代碼異味。當有其他更簡單的方法來解決問題時,它的氣味更強烈。 –
@james large:這是我的第一個答案。我稍後編輯了儘可能最小的修改代碼。可能不是我最好的想法... – Xvolks