作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个服务器类,它监听特定端口号以获取客户端发出的请求。对于每个客户端,它都会打开一个单独的执行线程。
但问题是服务器程序每隔几天就会得到控制,我不得不一次又一次地重新启动该程序。
因此,我开始编写测试用例来检查线程在完成工作后是否正确终止,这是我的代码
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/
我是一名优秀的程序员,十分优秀!