システムに長い遅延がある場合は、スレッドを増やすのが最善の方法です。同時に実行されるスレッドの数を制限したい場合は、許可を使用できます。たとえば、ブロッキング操作があると解放され、ブロッキングが終了すると再取得されるセマフォなどです。これにより、一度に実行できるスレッドの数が制限されますが、多くのタスクを簡単に切り替えることができます。
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()を呼び出してブロッキングタスクを実行できるようにすることもできますが、ブロッキング中に別のスレッドを実行できるようにします。