[英]More than one start on one Thread
我试图启动一个线程不止一次。 但是我读到这是不可能的,因为我为此得到了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) ;
}
因为您不能在线程上两次调用start。
一次启动一个线程永远是不合法的。 特别是,线程一旦完成执行就可能不会重新启动。
您必须将run()放入一个工作单元 -需要由多个线程执行的代码。 然后实例化所需数量的线程(在每个线程上调用start,但只能调用一次)。
忘记启动自己的一个或多个线程。 请改用ThreadPool
。
使用线程池,您可以运行称为“运行器”的方法。 将所有智能手机放入线程安全(“并发”)非阻塞队列。 每个“运行程序”会从队列中弹出下一个智能手机,执行测试,然后返回。 只要队列不为空,就一直保持跑步者的状态。 或一次运行与智能手机一样多的跑步者,让ThreadPool担心跟踪其中有多少跑步者将同时运行。
阅读ThreadPools,它们是用于工作的工具。
将您的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()
一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.