繁体   English   中英

一个线程有多个启动

[英]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。

线程API:

一次启动一个线程永远是不合法的。 特别是,线程一旦完成执行就可能不会重新启动。

您必须将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM