我正在使用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