gpt4 book ai didi

java - Java中的线程等待列表

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

我正在使用 HttpClient 编写一个 swing 应用程序,我需要一种方法来制作下载列表,因为我需要等待 1 分钟(例如)才能开始新的下载。

所以我想创建一个线程等待列表(下载)。我会有一个带有时间参数并包含线程列表的类,当我在列表中添加一个线程时,如果没有正在运行的线程,它就会启动。否则等待轮到它。

有什么工具可以做到这一点吗?

非常感谢您的帮助。

最佳答案

是的。 ScheduledExecutorService .您可以通过 Executors.newScheduledThreadPool(corePoolSize) 创建固定长度的服务。当您准备好提交等待时间的任务时,只需将其提交到 ScheduledExecutorService.schedule

ScheduledExecutorService e = Executors.newScheduledThreadPool(10)
private final long defaultWaitTimeInMinutes = 1;
public void submitTaskToWait(Runnable r){
e.schedule(r, defaultWaitTimeInMinutes, TimeUnit.MINUTES);
}

此处任务将在提交后 1 分钟内启动。并解决你的最后一点。如果当前有正在下载的任务(此配置意味着正在下载 10 个任务),则在 1 分钟后,提交的可运行对象将必须等到其他下载之一完成。

请记住,这与您的设计方式有些偏差。对于每个新任务,您不会创建一个新线程,而是提交给已经有线程等待的服务。例如,如果您只想一次下载一个任务,您可以将 Executors.newScheduledThreadPool(10) 更改为 Executors.newScheduledThreadPool(1)

编辑:我将保留我之前的答案,但使用解决方案更新它以提交任务以在上一个任务完成后恰好 1 分钟开始。您将使用两个 ExecutorService。一个提交给预定的执行器,另一个提交定时执行。最后,第一个 Executor 将等待完成并继续排队的其他任务。

ExecutorService e = Executors.newSingleThreadExecutor();
ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(1)
public void submitTask(final Runnable r){
e.submit(new Runnable(){
public void run(){
ScheduledFuture<?> future= scheduledService.schedule(r, defaultWaitTimeInMinutes, TimeUnit.MINUTES);
future.get();

}
});
}

现在当 future.get();完成下一个通过 submitTask 提交的 Runnable 将被运行,然后被调度一分钟。最后,只有当您要求任务等待 1 分钟时,即使没有其他任务提交,这也会起作用。

关于java - Java中的线程等待列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8747738/

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