如果你的系统有很长的延迟,最好的办法是拥有更多的线程。如果您想限制并发运行的线程数,您可以使用许可,例如信号量,它在您有阻塞操作时释放,并在阻塞完成时重新获取。这可确保您一次运行的线程数量有限,但允许您轻松地在多个任务之间切换。
public abstract class LimitedTask implements Runnable {
static final Semaphore PERMITS = new Semaphore(Runtime.getRuntime().availableProcessors());
@Override
public final void run() {
try {
PERMITS.acquire();
} catch (InterruptedException e) {
System.err.println("Task " + getClass() + " cancelled before it was started.");
return;
}
try {
runTask();
} finally {
PERMITS.release();
}
}
protected abstract void runTask();
protected void runBlockingTask(Runnable runnable) {
PERMITS.release();
try {
runnable.run();
} finally {
PERMITS.acquireUninterruptibly();
}
}
}
在此示例中,您可以拥有任意数量的这些,但只有有限的数量会在 PERMIT 区域内。这些任务还可以调用 runBlockingTask() 以允许它执行阻塞任务,但允许另一个线程在它阻塞时运行。