我不止一次试着启动一条线。但我读到这是不可能的,因为我为此得到了一个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) ;
}发布于 2016-08-26 21:31:20
忘记启动您自己的线程或线程,并使用您自己的信号灯编排它们。这构成了( a)过度设计,( b)没有使用合适的工具来完成这项工作。
线程可以由线程池管理,所有的信号量都可以替换为一个并发(线程安全)队列。
使用线程池,您可以运行称为"runners“的方法。您可以在需要一个新的运行程序时创建一个新的运行程序,但是只要让它在循环中运行就可以更容易地重用现有的运行程序。诀窍是,在循环的每一次迭代中,运行程序从队列中选择要处理的下一项并对其进行处理。
因此,在您的示例中,您将所有的智能手机都填充到一个队列中,然后每个“运行者”都会等待直到智能手机可用来排队、排队列、执行测试和重复。并发阻塞队列的实现保证了它将在消费者之间公平地共享其内容。
如果您有N个跑步者,并且希望他们优雅地停止,那么将一个特殊哨兵值的N个实例排队,这意味着“请退出”。当一个跑步者看到这个特殊的价值,它就会退出。这将导致完全N个跑步者退出。
在java.util.concurrent.BlockingQueue和ThreadPoolExecutor上阅读,它们是用于工作的工具。
发布于 2016-08-26 21:30:47
因为不能在线程上调用start两次。
不止一次地启动线程是不合法的。特别是,线程一旦完成执行就不能重新启动。
您必须将run()放入一个工作单元--需要由多个线程执行的代码。然后根据需要实例化尽可能多的线程(对每个线程调用start,但只调用一次)。
发布于 2016-08-26 21:33:28
将您的线程实现提取到它自己的类中,实例化其中的一些实例,然后逐个启动它们。示例:
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.
}但是,正如其他人已经指出的,每个线程实例只能被start()编辑一次。
https://stackoverflow.com/questions/39174839
复制相似问题