Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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 一个线程上有多个起始_Java_Multithreading - Fatal编程技术网

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的信号量变得不必要,因为它的目的似乎只是限制并发运行的线程数量。我并不一定反对自己进行线程管理,但这种情况似乎非常适合使用池。