私はHTTPリクエストを受け取るJavaアプリケーションを作っています。入ってくるリクエストごとに、私は新しいスレッドを開始し、そのスレッドではリクエストを読んで必要なアクションを実行しています。しかし、私はユーザーが "Loris Attack"を実行しないようにしたいので、スレッドにmaxTime
という値を与えることを考えていました。スレッドがmaxTime
よりも時間がかかる場合、スレッドは何を終了しても終了します。したがって、遅い接続もブロックされます。ではなく、に問題があります。Java - メインスレッドをブロックせずに時間の経過とともにtheadを停止
しかし、これを行うには正しい方法がわかりません。私は次のコードを試しましたが、このコードは私のメインスレッドをブロックしています。私はメインスレッドをブロックすることなく、このような何かをする方法を探しています。
コード:
/**
* Executor which is used for threadpools.
*/
private ExecutorService executor;
/**
* Constructor for the class RequestReceiver.
* Initializes fields.
*/
public RequestReceiver() {
this.executor = Executors.newFixedThreadPool(200);
}
@Override
public void run() {
try {
this.serverSocket = new ServerSocket(port);
} catch (IOException ex) {
Logger.getInstance().logText("Could not start server on port: " + port);
return;
}
Logger.getInstance().logText("Server running at port: " + port);
try {
while (shouldContinue) {
Socket client = serverSocket.accept();
HTTPRequestHandler handler = new HTTPRequestHandler(client);
Thread t = new Thread(handler);
executor.submit(t).get(10, TimeUnit.SECONDS); //This line is blocking
}
} catch (IOException ex) {
Logger.getInstance().logText("Server is shutdown");
} catch (InterruptedException | ExecutionException | TimeoutException ex) {
Logger.getInstance().logText("Thread took too long, it's shutdown");
}
}
executor.shutdown ; '文をブロックした直後' executor.submit(t).get(10、TimeUnit.SECONDS); ' – harshavmb
@harshavmbこれが私の問題をどのように解決するのか分かりません。私はそれを試みました、そして、私が予想したように、それは墜落しました。なぜなら、2番目のHTTPリクエストを送信すると、プールはシャットダウンされているからです。 'java.util.concurrent.RejectedExecutionException' – Guido
あなたのメインスレッドにFuture#を呼び出すのはなぜですか?あなたはそれで何もしません。さらに、TimeOutExceptionはタスクを停止しません。 – matt