java - 如何并发运行ScheduledThreadPoolExecutor

标签 java multithreading scheduler

我有一个程序,可以定期检查网页中的新数据,然后下载并将其转换为另一种格式。由于一个数据集的下载主要是等待,因此可以通过在下载另一个数据集的同时处理一个数据集来加快程序速度,因此我想使用多线程。不幸的是,即使我将执行程序构造函数参数 corePoolSize 设置为大于 1,ScheduledThreadpoolExecutor.scheduleAtFixedRate() 也会阻塞,直到一个 Runnable 完成。作为一种解决方法,我将同一个 Runnable 排队两次,但是否还有更多优雅的解决方案?

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Downloader
{
    public static void main(String[] args)
    {
        ScheduledThreadPoolExecutor e = new ScheduledThreadPoolExecutor(4);
        e.scheduleAtFixedRate(new Scheduler(), 0, 1, TimeUnit.SECONDS);
        e.scheduleAtFixedRate(new Scheduler(), 1, 1, TimeUnit.SECONDS);
    }
}

最佳答案

将任务分成两个子任务,并将它们分别调度到各自的线程池上。

您可以让X个线程执行下载任务并将工作排队到作业队列中,并让Y个处理线程将工作项出队并进行处理。

关于java - 如何并发运行ScheduledThreadPoolExecutor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26970658/

相关文章:

java - 我发现什么样的对象导致内存泄漏,现在该怎么办?

java - 这里的两种情况不同

java - * 和 ? 之间的区别在 Spring @Scheduled(cron =".....")

java - 为什么变量在同步时对其他线程不可见?

java - 同步线程和锁定

java - 是否可以在 Web 应用程序中运行 cron 作业?

linux - linux内核2.4.27中 'Niceness'和 'Goodness'的区别

java - 如何为对象的 ArrayList 创建 toString 方法?

java - 如何找到图像文件中的隐藏文件 (Jpg/Gif/Png)

c++ - 使用操作当前对象的线程是否安全?