如何测试 运行 线程是否在使用 JUnit 完成后正确终止

How to test running threads if they are terminating properly when they all done using JUnit


我有一个服务器 class,它在特定端口号上侦听客户端发出的请求。并为每个客户端打开一个单独的执行线程。
但问题是服务器程序每隔几天就会上手,我不得不一次又一次地重新启动该程序。

所以,我开始编写测试用例来检查线程在完成工作后是否正确终止,这是我的代码

public class ExampleTestWithJunit extends TestCase {

public void testExampleThread() throws Throwable {

    int client = 0;
    while(true) {
        Runnable tr1 = new GPSService(new Socket(), client++, "http://localhost/url1");         
        Thread thread = new Thread(tr1);

        System.out.println("State: "+thread.getState());
        System.out.println("Is Alive..? "+thread.isAlive());
        thread.start();         
    }
}

private class GPSService implements Runnable {
    private Socket socket;
    private int clientNumber;
    private String serverUrl;
    public GPSService(Socket socket, int clientNumber, String serverUrl) {
        this.socket = socket;
        this.clientNumber = clientNumber;
        this.serverUrl = serverUrl;
        System.out.println("New connection with client# " + clientNumber + " at " + socket);            
    }

    public void run() {
       //My Business logic      
    }
}    
}

从这里我无法弄清楚如何检查所有线程是否正确关闭。
如果我在任何地方都错了,请随时指出其他地方,请建议我实现这一目标。我已经坚持了好几天了,我希望我能在这里找到合适的答案。

您可以使用具有预定义线程数的 ExecutorService 并将您的作业提交到此 ExecutorService

完成后,您可以尝试关闭执行程序(此操作不会停止任何作业)。然后你可以轮询执行器以查看是否所有作业都已完成并据此采取行动。

示例代码:

@Test
public void test() throws Exception {
    int numThreads = 10;
    ExecutorService executor = Executors.newFixedThreadPool(numThreads);
    for (int i = 0; i < numThreads; i++) {
        executor.execute(new GPSService());
    }
    executor.shutdown();
    while (!executor.awaitTermination(1, TimeUnit.SECONDS)) {
        // Threads are still running
    }
    // All threads are completed
}