gpt4 book ai didi

Java 并发限制。只允许一个请求进入

转载 作者:行者123 更新时间:2023-12-01 07:29:38 27 4
gpt4 key购买 nike

我有长时间运行的代码,会受到请求的影响,导致更高的资源使用率和不必要的并发问题。我的解决方案是有一个等待区域,每个线程等待一些预定义的时间。如果线程等待时没有新请求,则继续执行该操作。任何新的请求都会再次重置时钟,并且我们释放之前的线程。

我之前使用过信号量和倒计时锁存器,但它们都不适合这个特定的场景。在我手动编写代码之前,我想看看是否有标准的方法。

最佳答案

I have long running code, that gets battered with requests, it causes higher resource usage and unneeded concurrency problems.

在我看来,您应该使用节流的ExecutorService。您应该拥有固定数量的线程,并且在收到新请求时创建新线程。然后您可以通过调整池中的线程数量来最大化吞吐量。

// only allow 10 concurrent requests
ExecutorService threadPool = Executors.newFixedThreadPool(10);
...
while (requestsComeIn) {
threadPool.submit(yourRunnableRequest);
}
// you need to shut the pool down once no more requests come in
threadPool.shutdown();

要限制请求,您应该使用RejectedExecutionHandler。类似下面的代码应该可以在队列中 100 个元素之后的 block 中工作:

BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(100);
ThreadPoolExecutor threadPool =
new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, queue);
// we need our RejectedExecutionHandler to block if the queue is full
threadPool.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
// this will block the producer until there's room in the queue
executor.getQueue().put(r);
} catch (InterruptedException e) {
throw new RejectedExecutionException(
"Unexpected InterruptedException", e);
}
}
});

My solution is to have like a waiting area, where each thread waits for some predefined time.

您可以通过ThreadPoolExecutor免费获得它。例如,您可以分配 1 个核心线程和 10 个最大线程,然后指定(例如)5L, TimeUnit.MINUTES,这样如果 5 个额外线程之一 hibernate 5 分钟,它将关闭。需要注意的是,不幸的是,ThreadPoolExecutor 不会启动超过核心线程的数量,除非队列已满。因此,只有在队列中有 100 个事物之后,才会分配第二个线程。因此,我通常将核心和最大线程参数设置为相同的值。

关于Java 并发限制。只允许一个请求进入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19121105/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com