Java 一个线程上有多个起始
我不止一次尝试开始一个线程。但我读到这是不可能的,因为我得到了一个非法的例外。我正试着做下面的事情。我有智能手机。我想对应用程序进行自动测试。测试是并行的,每个设备一个应用程序。有办法解决吗?这是我的密码Java 一个线程上有多个起始,java,multithreading,Java,Multithreading,我不止一次尝试开始一个线程。但我读到这是不可能的,因为我得到了一个非法的例外。我正试着做下面的事情。我有智能手机。我想对应用程序进行自动测试。测试是并行的,每个设备一个应用程序。有办法解决吗?这是我的密码 Semaphore smartphones = new Semaphore(androidComponents.size()); Thread evaluationProcess = new Thread() { public void run() {
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,但只调用一次)。因为不能对一个线程调用start两次 多次启动线程是不合法的。特别是 线程一旦完成执行,就不能重新启动
您必须在run()中放入一个工作单元,即需要由多个线程执行的代码。然后根据需要实例化尽可能多的线程(每个线程调用start,但只调用一次)。忘记启动自己的线程。使用
线程池
通过线程池,您可以运行称为“runners”的方法。将所有智能手机置于线程安全(“并发”)非阻塞队列中。每个“运行者”从队列中弹出下一个智能手机,执行测试,然后返回。只要队列不是空的,就保持启动跑步者。或者一次跑尽可能多的跑步者和智能手机,让ThreadPool担心有多少人会同时跑步
仔细阅读线程池,它们是用于作业的工具。忘记启动自己的一个或多个线程。使用
线程池
通过线程池,您可以运行称为“runners”的方法。将所有智能手机置于线程安全(“并发”)非阻塞队列中。每个“运行者”从队列中弹出下一个智能手机,执行测试,然后返回。只要队列不是空的,就保持启动跑步者。或者一次跑尽可能多的跑步者和智能手机,让ThreadPool担心有多少人会同时跑步
阅读线程池,它们是用于作业的工具。将线程实现提取到自己的类中,实例化其中的一些实例,然后逐个启动它们。例如:
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()
一次。将线程实现提取到它自己的类中,实例化其中的一些实例,然后逐个启动它们。例如:
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()
ed一次。您正在尝试启动一个已经运行的线程。从定义上讲,那是行不通的。也许你把Thread类或对象与Thread概念混淆了?好吧,创建一个可运行实例,然后从这个可运行实例创建几个线程实例。另外,不要使用忙循环来等待某些事情发生。执行器池应该比使用裸线程更好。创建新并发程序包是有原因的。您正在尝试启动一个已在运行的线程。从定义上讲,那是行不通的。也许你把Thread类或对象与Thread概念混淆了?好吧,创建一个可运行实例,然后从这个可运行实例创建几个线程实例。另外,不要使用忙循环来等待某些事情发生。执行器池应该比使用裸线程更好。新并发包的出现是有原因的,线程池负责线程记账,并在关闭线程池时处理线程连接。此外,固定大小的线程池会使OP的信号量变得不必要,因为它的目的似乎只是限制并发运行的线程数量。我并不一定反对自己进行线程管理,但这种情况似乎非常适合使用池。线程池负责线程记账,并在关闭池时处理线程连接。此外,固定大小的线程池会使OP的信号量变得不必要,因为它的目的似乎只是限制并发运行的线程数量。我并不一定反对自己进行线程管理,但这种情况似乎非常适合使用池。