确定Executors.newSingleThreadExecutor()创建的线程数。执行?

时间:2014-01-28 22:57:44

标签: java android multithreading future sequential

我有一个包含50个不同的newSingleThreadExecutor()代码实例的大型Android项目,这些实例由各种不可预测的事件触发,包括按下UI按钮。在研究了一下之后,我认为为50个不同的代码实例中的每一个创建了一个单独的线程,并且将保持对执行程序的调用的执行顺序。

创建了多少个线程,并且在按执行程序调用的顺序维护顺序执行时出现问题?

注意:代码没有使用提交,所以这就是为什么我对执行的顺序和创建的线程数感到困惑。例如,如果用户非常快速地按下UI按钮会发生什么?根据数据库期货何时完成,我会在不同时间完成一百个线程吗?

下面列出了在所有50个实例中如何格式化代码。

Executors.newSingleThreadExecutor().execute(new Runnable() {
    @Override
        public void run()
        { 
            // Executes multiple database calls using futures and
            // Uses get() which waits if necessary for the computation to complete, 
            // and then retrieves its result.
        }
    });

1 个答案:

答案 0 :(得分:1)

  

创建了多少个线程,并且在调用执行程序的顺序中维护顺序执行存在问题?

我不确定我是否在理解你是否每次都要询问池线程或每次循环时分叉的线程。

因此,如果您要在50次中创建 new ExecutorService,那么您无法确定实际创建了多少个线程。如果所有49个先前的作业仍在运行,则第50个作业将创建另一个作业。如果每个作业在执行下一个作业之前完成,则只创建一个线程。这没有考虑每个线程的期货和其他东西的数量。如果它已经是后台线程你真的需要多个期货等吗?

如果没有更多细节,我似乎正确的做法就是为所有50个工作使用单个 ExecutorService。然后,您可以确定是否需要固定数量的线程或使其动态化。

  

我认为为50个不同的代码实例中的每一个创建了一个单独的线程,并且将维护对执行程序的调用的执行顺序。

没有“顺序顺序”,因为您每次都在创建新的执行程序服务。如果您使用的是单个,那么保证顺序执行顺序的唯一方法是在池中只有一个线程。

  

例如,如果用户非常快速地按下UI按钮会发生什么?根据数据库期货何时完成,我会在不同时间完成一百个线程吗?

是的,您将获得100个不同的主题。如果要再次控制分叉的最大线程数,请对所有任务使用单个线程池。

顺便说一句,在提交上一份工作后,您必须始终关闭执行服务:

ExecutorService threadPool = Executors.newSingleThreadExecutor();
threadPool.execute(new Runnable() { ... });
// this must be done to properly quit the threads
threadPool.shutdown();
相关问题