gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:23:02 27 4
gpt4 key购买 nike


我有一个服务器类,它监听特定端口号以获取客户端发出的请求。对于每个客户端,它都会打开一个单独的执行线程。
但问题是服务器程序每隔几天就会得到控制,我不得不一次又一次地重新启动该程序。

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

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
}

关于java - 如何测试正在运行的线程在使用 JUnit 完成后是否正确终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30886848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com