我是ExecutorService的新手。现在我的方案是"数百万的数据365 * 24 * 7正在进入" 我对使用线程的数据进行了一些处理。
ExecutorService es = Executors.newSingleThread();
es.execute(new ComputeDTask(data));
我将数据发送到ComputeDTask进行执行。
每次数据进入时创建new ComputeDTask
的效率如何?也就是说,如果数据被接收一百万次,那么将创建一百万个ComputeDTask对象。
答案 0 :(得分:2)
创建线程的开销大约为100微秒。也就是说,如果你的工作时间不到100微秒,那么你的工作开销就会比完成的工作少得多,而你编程的速度可能会慢于单线程。
为现有Executor服务创建任务的开销约为2微秒。也就是说,如果任务花费的时间少于2微秒,那么你可能会比实际完成的工作有更多的开销。
如果您有CPU绑定进程,则需要与核心数相同的线程数,以保持所有核心繁忙,同时最大限度地减少开销。
e.g。如果您有8个核心,我建议您将完成的工作结合起来,这样您就有8个线程,每个总计一个任务。您可以拥有比此更多的任务,但您可能会发现需要更长的时间来处理。
当然,您应该在完成后关闭ExecutorService。您在所有示例中都没有看到这一点的原因是,创建一个 ExecutorService是一个好主意,它可以用于应用程序的生命周期。
答案 1 :(得分:1)
显然,您正在为每项任务创建一个全新的ExecutorService
,并且永远不会关闭它们。这当然会导致您正在观察的线程泄漏。使用ExecutorService
的正确方法是创建单个实例,为您管理线程池。执行者在管理线程方面非常灵活和强大。
答案 2 :(得分:0)
对于传入的数据,甚至使用new ComputeDTask(data)
创建任务,然后将其传递给ThreadPool,在那里你可以说100个线程,然后他们可以执行更高吞吐量的任务。
ExecutorService es = Executors.newFixedThreadPool(100);
onGetData(){
es.execute(new ComputeDTask(data));
}