一个线程上不止一个开始

时间:2016-08-26 21:27:04

标签: java multithreading

我试图多次启动一个帖子。但我读到这是不可能的,因为我得到了一个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) ;
    }

3 个答案:

答案 0 :(得分:3)

因为您无法在线程上调用两次启动。

Thread API:

  

不止一次启动线程永远不合法。特别是,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()一次。