如何同时运行ScheduledThreadPoolExecutor

时间:2014-11-17 10:33:00

标签: java multithreading scheduler

我有一个程序定期检查网页中的新数据,然后下载并将其转换为其他格式。因为一个数据集的下载主要包括等待,所以可以通过处理一个数据集同时下载另一个数据集来加速程序,因此我想使用多线程。不幸的是,ScheduledThreadpoolExecutor.scheduleAtFixedRate()阻塞,直到一个Runnable完成,即使我将执行器构造函数参数corePoolSize设置为大于1.作为一种解决方法,我将相同的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);
    }
}

1 个答案:

答案 0 :(得分:2)

将任务分成两个子任务,并在他们自己的线程池中单独安排这些任务。

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