我有1000个RTP流,每个30秒,我需要流到服务器,每个流应该在不同的线程上运行。
现在我只是使用一个循环来创建这些线程并启动任务,因为初始化延迟。我想在初始化上传播一些负载并在每秒~3.5-20
个线程之间开始。
最好的方法是什么?
答案 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 还保留了一些基本的统计数据,比如已完成的数量 任务。
'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]