如何在java中每隔Y秒创建X个任务(线程)?

时间:2015-09-01 11:58:19

标签: java multithreading

我有1000个RTP流,每个30秒,我需要流到服务器,每个流应该在不同的线程上运行。

现在我只是使用一个循环来创建这些线程并启动任务,因为初始化延迟。我想在初始化上传播一些负载并在每秒~3.5-20个线程之间开始。

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

您应该阅读ExecutorService框架并确定哪个Executor案例最适合您。

非常基本的例子:

    ExecutorService executor = Executors.newFixedThreadPool(5);
    for (int i = 0; i < 1000; i++) {
        Runnable worker = new WorkerThread('' + i);
        executor.execute(worker);
    }
    executor.shutdown();
    while (!executor.isTerminated()) {
    }

您可能不希望同时发送1000个Thread,而是ThreadPool

此外,如果您想延迟或按计划启动主题,请参阅ScheduledThreadPoolExecutor

答案 1 :(得分:1)

使用线程池比根据需要创建单个线程更好。在Java中,线程创建涉及时间开销。线程池克服了这种延迟。

  

线程池解决了两个不同的问题:它们通常提供   在执行大量异步时提高了性能   任务,由于减少了每个任务的调用开销,并且它们提供了一个   绑定和管理资源的方法,包括线程,   在执行任务集合时消耗。每个ThreadPoolExecutor   还保留了一些基本的统计数据,比如已完成的数量   任务。

参考:JavaOfficialDocs

'ExecutorService'用于使用线程池执行作业。这克服了每次调用的线程创建开销

参考:[http://tutorials.jenkov.com/java-util-concurrent/executorservice.html]

同样请查看Java7中引入的'ForkJoinPool',它具有'工作窃取'功能,空线程从忙线程中获取作业的能力

参考:[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinPool.html]