如何在onCreate()中启动Android中的多个线程而不使用for循环获取Thread已经启动(IllegalThreadStateException)?

时间:2016-11-14 06:34:44

标签: java android multithreading illegalstateexception

我正在执行应用程序的负载测试并且有5个线程。我希望所有线程都在shuffle中运行,因此知道设备上的负载。假设运行所有线程的次数是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();
    }

 }

编辑1:了解ExecutorService框架和Threadpool的概念并完成了它。是否可以通过使用ExecutorService来实现上述场景?
类似..

1.创建ExecutorService实例,
2。固定ThreadPools的数量,
3。创建列表对象,
4。使用Iterator检查下一个元素,5。将线程添加到List对象,最后通过ExecutorService对象执行..
我的思想和过程是否正确?

**如果询问我的问题或程序的方式是错误的,请纠正我而不是低估,因为我是新手..

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

根据我的理解,你希望再次重复这项任务很多次。

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

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