私が書いたWebサーバーでは、各リクエストがアクションのリストを呼び出します。これらのアクションのいくつかは、他のアクションほど重要ではないため、バックグラウンド スレッドで実行したいと考えています。
また、それらはそれほど重要ではないため、そのうちの 1 つがめったに失敗しないかどうかは気にしません。また、それらがスレッドを永久に占有することを望まないため、他のスレッドを次のバッチの処理に使用できます。
したがって、スレッド プール (例: 10 スレッド) を用意し、このように各バックグラウンド タスクにスレッドを割り当てたいと思います。各スレッドを 1 秒に制限し、その時間までに終了しない場合は、スレッドを強制終了して、次のタスクが開始されるようにします。
どうすればこれを行うことができますか?
これまでのところ、これは私が持っているものです:
public class AsyncCodeRunner {
private static final ExecutorService executor = Executors.newFixedThreadPool(10);
public void Run(Callable<Void> callableCode, int timeout) {
final int threadTimeout = 10;
Future<Void> callableFuture = executor.submit(callableCode);
try {
callableFuture.get(threadTimeout, TimeUnit.SECONDS);
} catch (Exception e) {
logger.Info("Thread was timed out", e);
}
}
}
そして、私はこのクラスを次のように使いたい:
public void processRequest(RequestObject request) {
// do some important processing
// throw some less important processing to background thread
(new AsyncCodeRunner()).Run(new Callable<Void> () {
@Override
public Void call() throws Exception {
// do something...
return null;
}
}, 1); // 1 second timeout
// return result (without waiting for background task)
return;
}
これは私が望むように機能しますか?または、どのように変更すればよいですか?
そして、私が呼び出しRun()
たが、スレッドプールに配布する利用可能なスレッドがない場合はどうなりますか?