0

我是 ExecutorService 的新手。现在我的场景是“有数百万个数据 365*24*7 进来”我有一些处理需要对使用线程进来的数据进行处理。

ExecutorService es = Executors.newSingleThread();
es.execute(new ComputeDTask(data));

我正在向 ComputeDTask 发送数据以执行某些操作。

new ComputeDTask每次数据进入时创建一个效率如何?也就是说,如果数据被接收一百万次,那么将创建一百万个 ComputeDTask 对象。

4

3 回答 3

2

创建线程的开销约为 100 微秒。即,如果您完成的工作少于 100 微秒,那么您的开销将比已完成的工作多,并且您的程序可能比单线程更慢。

为现有的 Executor 服务创建任务的开销约为 2 微秒。即,如果任务花费的时间少于 2 微秒,您的开销可能比实际完成的工作要多。

如果您有 CPU 密集型进程,则需要与核心数量大致相同的线程来保持所有核心忙碌,同时最大限度地减少开销。

例如,如果您有 8 个内核,我建议您将完成的工作结合起来,这样您就有 8 个线程,每个线程总共有一个任务。您可以有比这更多的任务,但您可能会发现处理时间更长。

当然,您应该在完成后关闭 ExecutorService。您没有在所有示例中看到这样做的原因是,创建一个用于应用程序生命周期的 ExecutorService 可能是个好主意。

于 2012-07-25T10:04:13.110 回答
1

显然,您正在为每个任务创建一个全新ExecutorService的任务,并且永远不会关闭它们。这当然会导致您正在观察的线程泄漏。正确的使用方法ExecutorService是创建一个为您管理线程池的实例。执行器在管理线程的方式上非常灵活和强大。

于 2012-07-25T10:03:52.477 回答
0

On incoming data even create the task using new ComputeDTask(data) and then pass this to ThreadPool where you have let say 100 threads and then they can execute task with higher throughput.

ExecutorService es = Executors.newFixedThreadPool(100);

onGetData(){

     es.execute(new ComputeDTask(data));

 }
于 2012-07-25T10:13:05.127 回答