【问题标题】:How do I stop a subroutine from ending before all contained threads are finished?如何在所有包含的线程完成之前阻止子例程结束?
【发布时间】:2014-04-13 23:47:00
【问题描述】:

基本上,我有几个线程,每个线程都在完成任务。

虽然我在这个子例程中对任务进行了多线程处理以加快整体程序速度。

我需要这个子程序只有在其中的所有线程完成后才关闭,因为在这个子程序完成后,下一个子程序需要生成的信息才能在程序中运行。

与现在发生的情况相反,它允许子例程关闭并让包含的线程在自己的时间在后台运行。这会强制下一个子例程运行,只对部分数据进行操作。

我该怎么做?

代码:

public void MainSetupTasks() throws ClientProtocolException, IOException {

    new Thread(new Runnable() {

        @Override
        public void run() {

            // Tasks to be complete

        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {

            // Tasks to be complete

        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {

            // Tasks to be complete

        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {

            // Tasks to be complete

        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {

            // Tasks to be complete

        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {

            // Tasks to be complete

        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {

            // Tasks to be complete

        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {

            // Tasks to be complete

        }
    }).start();

}

【问题讨论】:

  • 听起来您应该熟悉 Java 并发文档:docs.oracle.com/javase/tutorial/essential/concurrency
  • 您希望每个人都等待另一个人吗?或者你想在所有这些都完成后得到一个事件?
  • 好吧,你为什么不改用ExecutorService
  • 我从来没有使用过“ExecutorService”,你能给出一个代码示例吗?
  • 如果我遇到了您的问题,您需要 Cyclicbarrier 或 countdownlatch。加入是否不可能?

标签: java android multithreading android-fragments android-activity


【解决方案1】:

要解决您眼前的问题,您可以使用类似How to wait for a set of threads to complete?

但这很丑陋。内置的ExecutorService 让您以更简洁的方式启动后台线程。

【讨论】:

  • ExecutorService 似乎是更好的选择,您介意展示一个代码示例吗?
  • This 看起来很不错的教程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2020-06-05
  • 2015-12-12
  • 2021-01-21
相关资源
最近更新 更多