Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试正在运行的线程在使用JUnit时是否正确终止_Java_Multithreading_Junit - Fatal编程技术网

Java 如何测试正在运行的线程在使用JUnit时是否正确终止

Java 如何测试正在运行的线程在使用JUnit时是否正确终止,java,multithreading,junit,Java,Multithreading,Junit,我有一个服务器类,它在特定端口号上侦听客户机发出的请求。对于每个客户端,它会打开一个单独的执行线程。 但问题是,服务器程序每隔几天就有一次,我不得不一次又一次地重新启动该程序。 因此,我开始编写测试用例,检查线程在完成任务后是否正确终止,下面是我的代码 从这里,我不知道如何检查所有线程是否正确关闭。 如果我有任何错误,请随意指出其他地方,请建议我实现这一目标。我已经被这个问题困扰了好几天,我希望我能在这里找到正确的答案。您可以使用一个带有预定义线程数的执行器服务,并将您的作业提交到此执行器服


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

因此,我开始编写测试用例,检查线程在完成任务后是否正确终止,下面是我的代码

从这里,我不知道如何检查所有线程是否正确关闭。

如果我有任何错误,请随意指出其他地方,请建议我实现这一目标。我已经被这个问题困扰了好几天,我希望我能在这里找到正确的答案。

您可以使用一个带有预定义线程数的
执行器服务
,并将您的作业提交到此
执行器服务

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

示例代码:

@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
}
@测试
public void test()引发异常{
int numThreads=10;
ExecutorService executor=Executors.newFixedThreadPool(numThreads);
for(int i=0;i
@K Erlandsson您的回答对我来说开始有意义了,但有一点需要澄清,您提到了预定义的线程数,但我不能在我的程序中这样做,因为它是动态的,线程不断增加fired@KishoreKumarKorada我不太明白。在示例代码中,从测试开始线程。如果要这样做,就不能“动态”启动线程。但是,您可以选择另一种方式来启动线程,而不是在测试开始时提交10个线程,如果这是您想要的。你能详细说明一下吗?@K Erlandson那是我的错。您已经提到“但是,您可以选择另一种方式来启动线程,而不是在测试开始时提交10个,如果这是您想要的”。这就是我想问的,现在我明白了。谢谢。不过,如果您想从workers线程执行断言,您可以看看这种方法。
@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
}