Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中每Y秒创建X数量的任务(线程)?_Java_Multithreading - Fatal编程技术网

如何在java中每Y秒创建X数量的任务(线程)?

如何在java中每Y秒创建X数量的任务(线程)?,java,multithreading,Java,Multithreading,我有1000个30秒的RTP流,每个流需要流到服务器,每个流应该在不同的线程上运行 由于初始化延迟,现在我只是使用一个循环来创建这些线程并启动任务。我想在初始化过程中分散一些负载,并从每秒~3.5-20个线程开始 最好的方法是什么?您应该仔细阅读该框架,并决定哪个执行者案例最适合您 非常基本的例子: ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 1000; i+

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

由于初始化延迟,现在我只是使用一个循环来创建这些线程并启动任务。我想在初始化过程中分散一些负载,并从每秒
~3.5-20个
线程开始

最好的方法是什么?

您应该仔细阅读该框架,并决定哪个执行者案例最适合您

非常基本的例子:

    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()) {
    }
ExecutorService executor=Executors.newFixedThreadPool(5);
对于(int i=0;i<1000;i++){
Runnable worker=新WorkerThread(“”+i);
执行人,执行人(工人);
}
executor.shutdown();
而(!executor.isTerminated()){
}
您可能不希望同时使用1000个
线程
s,而是希望使用
线程池


另外,如果要延迟或按计划启动线程,请参阅。

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

线程池解决两个不同的问题:它们通常提供 提高了执行大量异步任务时的性能 任务,因为减少了每个任务的调用开销,它们提供了 限制和管理资源(包括线程)的方法, 在执行任务集合时使用。每个线程池执行器 还维护一些基本统计信息,例如已完成的项目数量 任务

参考:

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

参考:[

另外,请查看Java7中引入的“ForkJoinPool”,它具有“工作窃取”特性,即空线程能够从繁忙线程获取作业


参考:[

您是否有1000个处理器可用?单个处理器上的1000个线程可能比串行处理速度慢,因为所有这些线程都会将彼此的时间分割到死亡。为什么需要爬升?…每个流都应该在不同的线程上运行为什么?创建和销毁线程的成本很高。最好有执行给定任务的可重用工作线程池。然后您可以说,“每个流应该在其自己的任务中运行。”创建和销毁任务的成本并不比创建和销毁任何其他类型的对象的成本高。有关线程池的更多信息,请参阅RobAu的答案和Mikki的答案。但是,它没有这里要求的爬升功能。为什么OP需要爬升?这几乎从来没有真正需要过。几乎从来没有-除了在OP问的这个问题:-)@USer22999299上面的代码并行运行5个线程。你可以将固定线程池的大小增加到你喜欢的任何数量。如果你的
线程
受CPU限制,那么超过CPU的线程将限制你的性能。我猜你的问题受服务器容量的限制?@RobAu true,最后我确实使用了t执行者服务,以及使用计数器和%与#callPerSecond一起使用1秒的睡眠计时器,此技巧效果良好:)谢谢!