Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中的onCreate()中启动多个线程,而不使用for循环启动线程(IllegalThreadStateException)?_Java_Android_Multithreading_Illegalstateexception - Fatal编程技术网

Java 如何在Android中的onCreate()中启动多个线程,而不使用for循环启动线程(IllegalThreadStateException)?

Java 如何在Android中的onCreate()中启动多个线程,而不使用for循环启动线程(IllegalThreadStateException)?,java,android,multithreading,illegalstateexception,Java,Android,Multithreading,Illegalstateexception,我正在执行一个应用程序的负载测试,有5个线程。我希望所有线程都以随机模式运行,因此知道设备上的负载。假设运行所有线程的次数为5次,则所有线程应在没有IllegalThreadStateException的情况下成功运行5次。 我知道多次启动线程是不正确的。那么如何通过使用while和for循环来实现这一点呢? 我已经写了一个样本,但得到了例外 int count = 5; for(int i = 0; i < count; i++){ System.out.println("Loo

我正在执行一个应用程序的负载测试,有5个线程。我希望所有线程都以随机模式运行,因此知道设备上的负载。假设运行所有线程的次数为5次,则所有线程应在没有IllegalThreadStateException的情况下成功运行5次。 我知道多次启动线程是不正确的。那么如何通过使用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();
    }

 }
int计数=5;
for(int i=0;i
编辑1:了解了ExecutorService框架和Threadpool的概念并进行了介绍。使用ExecutorService是否可以实现上述场景?
类似..

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


**如果问我的问题的方式或程序是错误的,请纠正我,而不是投反对票,因为我是一个新手。

因为你已经意识到不能多次启动线程。因此,您需要创建一个新线程,而不是在每次迭代中都启动同一个线程

List<Thread> threads = new ArrayList<>();
for(int i = 0;i < 5;i++){
    Thread thread = new Thread();
    thread.start();
    threads.add(thread);
}
List threads=new ArrayList();
对于(int i=0;i<5;i++){
线程=新线程();
thread.start();
线程。添加(线程);
}

据我所知,您希望再次重复该任务数次

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

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


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