【问题标题】:How Do I start multiple threads in Android in onCreate() without getting Thread Already started (IllegalThreadStateException) using for loop?如何在 onCreate() 中启动多个线程而不使用 for 循环启动线程 (IllegalThreadStateException)?
【发布时间】:2017-03-27 18:09:52
【问题描述】:

我正在执行应用程序的负载测试并且有 5 个线程。我希望所有线程都随机运行,因此知道设备上的负载。假设所有线程运行的次数为5,那么所有线程应该成功运行5次而没有IllegalThreadStateException。 我知道多次启动一个线程是不正确的。那么如何通过使用 while 和 for 循环来实现这一点? 我已经编写了一个示例,但遇到了异常。

int count = 5;
for(int i = 0; i < count; i++){
    System.out.println("Loop " + i);

    try {
        th.start();
        th2.start();
        smart.start();
        fpthread.start();
        idthread.start();

        System.out.println("The count is " +count);
    } catch (Exception e) {
        e.printStackTrace();
    }

 }

edit 1:了解了ExecutorService框架和Threadpool的概念,并通过了它。使用ExecutorService是否可以实现上述场景?
Like..

1.创建一个 ExecutorService 实例,
2.固定线程池的数量,
3。创建一个列表对象,
4。使用迭代器检查下一个元素,
5。将线程添加到 List 对象并最终通过 ExecutorService 对象执行..
我的想法和过程正确吗?

** 如果提问的方式或程序有误,请纠正我而不是投反对票,因为我是新手..

【问题讨论】:

  • 目前还不清楚你想在这里做什么。您是否要同时运行 5 种线程的 5 个实例,总共 25 个线程?
  • 没有。如果我没有说清楚,我很抱歉。实际上,我正在开发一个具有 4 个模块(如打印机、指纹等)的设备。所以在每个线程中,我都有不同的逻辑方法。现在我想从 oncreate() 开始,以便所有测试都可以运行。这一次,它们运行良好。现在我想运行它们 5 次。如果我把它保持在一个循环中,那么我会得到 IllegalThreadStateException。所以寻找解决方案。任何解决方案都会有所帮助。
  • 在不知道更多关于你在做什么的情况下,我唯一能建议的就是你也实例化循环内的线程。您只能启动给定线程实例一次,因此如果您想运行给定类型的线程 X 次,那么您需要创建它的 X 个实例并启动每个实例。
  • 我读到了多线程,我知道 MT 中发生的异常。只是对启动所有线程并随机运行它们感到困惑。
  • “随机播放”是什么意思?是否要等到循环主体中启动的所有五个线程都完成后再开始下五个线程?

标签: java android multithreading illegalstateexception


【解决方案1】:

据我了解,您希望再次重复该任务若干次。

  1. 选项 1[不推荐] 您可以每次在循环中创建新线程然后启动。线程创建成本很高,这会带来性能问题。

  2. 选项 2。创建一次线程并启动一次。然后,您可以在 Thread(或关联的 Runnable)的每个 run 方法中运行一个 while 循环,并有一个 volatile 标志,您可以将其设置为 false 以中断每个 Thread 的 run 方法中的 while 循环。可能您可以为您创建的每个线程设置单独的标志并计算 while 循环的迭代次数。当计数等于您希望执行任务的次数时,您可以简单地决定将标志设置为 false 以中断循环。如果线程已被中断,您还可以设置中断并检查 while 循环。这样您就不需要单独的标志了。

【讨论】:

    【解决方案2】:

    正如您已经发现的那样,您不能多次启动线程。因此,您需要创建一个新线程,而不是每次迭代都启动同一个线程。

    List<Thread> threads = new ArrayList<>();
    for(int i = 0;i < 5;i++){
        Thread thread = new Thread();
        thread.start();
        threads.add(thread);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 2021-01-14
      • 2012-03-14
      • 1970-01-01
      相关资源
      最近更新 更多