作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个接收 HTTP 请求的 Java 应用程序。对于每个传入的请求,我都会启动一个新线程,并在该线程中读取请求并执行必要的操作。但是,我想防止用户执行“慢洛里斯攻击”,因此我正在考虑为线程指定一个 maxTime
值。如果线程花费的时间超过 maxTime,无论如何它都会终止。因此它也会阻止慢速连接,这不是问题。
但是,我不知道正确的方法是什么。我尝试了以下代码,但该代码阻塞了我的主线程。我正在寻找一种方法来执行类似的操作,而不阻塞主线程。
代码:
/**
* 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");
}
}
最佳答案
对示例进行最少的更改即可获得与您想要的类似的结果,那就是提交新任务。
Socket client = serverSocket.accept();
HTTPRequestHandler handler = new HTTPRequestHandler(client);
Future f = executor.submit(handler);
executor.submit(()->{
try{
f.get(10, TimeUnit.SECONDS);
} catch(TimeoutException to){
//timeout happened, this will cancel/interrupt the task.
f.cancel(true);
} catch(Exception e){
throw new RuntimeException(e);
//something else went wrong...
}
});
这可以工作,但它会阻塞等待 get 调用的附加线程。您还需要在 HTTPRequestHandler 代码中处理中断。
另一种方法可能是使用 ScheduledExecutorService
。
关于Java - 一段时间后停止线程而不阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44562257/
我是一名优秀的程序员,十分优秀!