我试图多次启动一个帖子。但我读到这是不可能的,因为我得到了一个IllegalThreadStateException。我试图做以下事情。我有 n 智能手机。我想对应用程序进行自动测试。测试是并行的,每个设备一个应用程序。任何解决它的想法?这是我的代码?
Semaphore smartphones = new Semaphore(androidComponents.size());
Thread evaluationProcess = new Thread() {
public void run() {
try {
smartphones.acquire();
[CODE FOR TESTING]
smartphones.release();
}
};
while (!evaluationCompleted(apps)) {
evaluationProcess.start();
while (smartphones.availablePermits() == 0) ;
}
答案 0 :(得分:3)
因为您无法在线程上调用两次启动。
不止一次启动线程永远不合法。特别是,a 一旦完成执行,线程可能无法重新启动。
您必须将run()作为工作单元 - 需要由多个线程执行的代码。然后根据需要实例化多个线程(在每个线程上调用start,但只调用一次)。
答案 1 :(得分:2)
忘记启动自己的线程或线程。请改用ThreadPool
。
使用线程池,您可以运行称为“runners”的方法。将所有智能手机放在线程安全(“并发”)非阻塞队列中。每个“跑步者”从队列中弹出下一个智能手机,执行测试并返回。只要队列不为空,就保持启动跑步者。或者同时运行与智能手机一样多的跑步者,让ThreadPool担心跟踪其中有多少将同时运行。
阅读ThreadPools,它们是用于工作的工具。
答案 2 :(得分:1)
将Thread实现解压缩到自己的类中,实例化其中的一些实例,然后逐个启动它们。例如:
public class MyThread extends Thread {
@Override
public void run() {
// Do some cool stuff here!
}
}
...然后,在您的代码中的其他地方,当您想要启动线程的多个“副本”时......
public void startThreads() {
MyThread threadA = new MyThread(),
threadB = new MyThread(),
threadC = new MyThread();
threadA.start();
threadB.start();
threadC.start();
// make as many as you need, then invoke start on them.
}
但正如其他人已经指出的那样,Thread的每个实例只能start()
一次。