gpt4 book ai didi

java - 条件延迟处理

转载 作者:行者123 更新时间:2023-11-30 11:02:18 25 4
gpt4 key购买 nike

我在 glassfish 下创建了一个新的线程池和一个新的关联监听器。线程池的最大容量为 100 个线程。我有一个每晚运行的预定作业,它应该触发来自远程客户端的 HTTP GET 请求。请注意,预定作业不是 HTTP 客户端。但是,它会触发远程 HTTP 客户端发出 HTTP GET 请求。请求的数量可以超过100。即使请求的数量超过100,计划的作业也应该以不间断的方式运行。下面是伪代码

class ScheduledJob{

public executeJob(){
{
for(i=0; i<=numberOfTasks; i++)
{
connectToTheClientsAndAskThemToFireHTTPGetRequests();
}
}

}

我想设计解决方案的方式是让 executeJob 方法以非阻塞方式执行。这意味着最初会触发 100 个请求,其余请求会被缓存。收到 200 OK 后,我会限制剩余的请求。请注意,HTTP 请求可能需要几秒钟,因为响应 HTTP GET 是一个 20MB 的二进制文件。这里的问题是是否有任何开箱即用的解决方案(数据结构)来执行我的缓存和触发业务逻辑,或者任何人都可以提出更好的解决方案。

最佳答案

一个选项是创建一个 Runnable,它采用 GetTasks 的并发队列(或者任何您想为 HTTP GET 请求数据命名的包装器)。 executeJob() 用所有 GetTasks 填充队列,构建一个包含 100 个线程的线程池,并提交 100 个共享相同并发的 Runnables队列。 Runnables 将轮询队列直到它为空,此时它们终止。

public class GetTask {}

public class GetTaskExecutor implements Runnable {
private final ConcurrentLinkedQueue<GetTask> queue;

public GetTaskExecutor(ConcurrentLinkedQueue<GetTask> queue) {
this.queue = queue;
}

public void run() {
GetTask task = null;
while((task = queue.poll()) != null) {
// do work
}
}
}

class ScheduledJob{
public boolean executeJob(){
ExecutorService service = Executors.newFixedThreadPool(100);
ConcurrentLinkedQueue<GetTask> queue = new ConcurrentLinkedQueue<>();
for(i=0; i<=numberOfTasks; i++) {
queue.offer(new GetTask());
}
for(int i = 0; i < 100; i++) {
service.execute(new GetTaskExecutor(queue));
}
return service.awaitTermination(4, TimeUnit.HOURS);
}
}

另一种方法是为每个 GetTask 创建一个 GetTaskExecutor 并将它们全部提交给 ExecutorService - 您使用的是固定线程池,因此一次最多执行 100 个任务。

public class GetTaskExecutor implements Runnable {
private final GetTask task;

public GetTaskExecutor(GetTask task) {
this.task = task;
}

public void run() {
// do work on single task
}
}

class ScheduledJob{
public boolean executeJob(){
ExecutorService service = Executors.newFixedThreadPool(100);
for(i=0; i<=numberOfTasks; i++) {
service.execute(new GetTaskExecutor(new GetTask());
}
return service.awaitTermination(4, TimeUnit.HOURS);
}
}

关于java - 条件延迟处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30850617/

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