【问题标题】:How to run threads in parallel in Android如何在Android中并行运行线程
【发布时间】:2016-03-10 08:09:50
【问题描述】:

我正在尝试并行运行多个线程。我试图通过拥有多个线程实例来实现这一点。我的假设是它将同时执行;但是,线程是按顺序执行的。

这是我测试的一个简单代码:

new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i=0; i<100; i++) {
                LMLog.info("THREAD", "Counting " + i + " in Thread A");
            }
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i=0; i<100; i++) {
                LMLog.info("THREAD", "Counting " + i + " in Thread B");
            }
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i=0; i<100; i++) {
                LMLog.info("THREAD", "Counting " + i + " in Thread C");
            }
        }
    }).start();

而且日志显示for循环正在一个接一个地执行

在 Thread A 中从 0 计数到 99,然后在 Thread B 和 Thread C 中进行相同的计数。

基于此,我得出结论,它们并没有像我想象的那样并行执行,而是按顺序执行。

那我怎样才能在Android中实现并行执行呢?

【问题讨论】:

  • 100 在 CPU 时间中的含义是什么?我怀疑由此可以获得任何有价值的数据。
  • 在每个循环中添加 Thread.sleep(100) 并重新运行您的代码

标签: java android multithreading android-studio


【解决方案1】:

我可能是错的,但我认为你的结论是错误的。原因是计数到 100 需要很短的时间,以至于实例化一个新线程并启动它可能需要更多时间。如果您想确保您的测试是“有效的”,您应该首先实例化所有 3 个线程,然后将它们全部启动,如下所示(也将计数器增加到 10k 或 100k):

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i=0; i<10000; i++) {
            LMLog.info("THREAD", "Counting " + i + " in Thread A");
        }
    }
Thread t2 = new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i=0; i<10000; i++) {
            LMLog.info("THREAD", "Counting " + i + " in Thread B");
        }
    }
Thread t3 = new Thread(new Runnable() {
    @Override
    public void run() {
        for (int i=0; i<10000; i++) {
            LMLog.info("THREAD", "Counting " + i + " in Thread C");
        }
    }
t1.start(); t2.start(); t3.start();

这纯粹是为了让您的“测试”工作。您还可以使用 AsyncTask 或其他一些方法。

【讨论】:

    【解决方案2】:

    最好使用AsyncTask,您可以使用Thread_POOL_EXECUTOR并行运行多个任务。

    【讨论】:

      【解决方案3】:

      使用Executors类他们提供了多种线程池。

      ExecutorService pool = Executors.newFixedThreadPool(numOfYourThreads)
      

      但要注意不要启动太多线程,以免给 CPU 带来太大压力。

      编辑: 正如我所见,佳能似乎是 AsyncTask 仅适用于短操作。如果您必须使用更长的任务,请使用 IntentService 或 ExecutorService。

      【讨论】:

      • 如果我必须执行一个不确定的任务,如何使用意图服务?
      【解决方案4】:

      这是ExecutorService的使用方法

      ExecutorService executorService = Executors.newFixedThreadPool(10);
        executorService.execute(new Runnable() {
              public void run() {
                  // do something
              }
          });
      
      executorService.shutdown();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 2023-03-05
        • 2015-02-14
        相关资源
        最近更新 更多