Java 程序在线程完成之前退出。如何让 Cucumber-JVM 等待线程退出?
Java program exits before thread has finished. How do I make Cucumber-JVM wait for the thread to exit?
我正在尝试在我的 Cucumber-JVM 程序中创建一个新线程,当我达到某个 BDD 步骤时。
然后,一个线程应该做某事,而原始主线程继续 运行ning 通过黄瓜步骤。
在所有线程完成之前,程序不应退出。
我运行遇到的问题是主程序在线程结束前退出。
这是正在发生的事情:
输出/问题
- 主程序是
RunApiTest
- 线程 class 是
ThreadedSteps
。
这是我 运行 程序时发生的情况:
RunApiTest
开始执行所有步骤
RunApiTest
达到 "I should receive an email within 5 minutes"
RunApiTest
现在创建一个线程 ThreadedSteps
,它应该休眠 5 分钟。
ThreadedSteps
开始睡5分钟
- 在
ThreadedSteps
睡觉时,RunApiTest
继续 运行Cucumber BDD 的剩余步骤
RunApiTest
完成并退出,无需等待 ThreadedSteps
完成!
如何让我的程序等待直到我的线程完成?
这是我的代码
主黄瓜Class: RunApiTest
@RunWith(Cucumber.class)
@CucumberOptions(plugin={"pretty"}, glue={"mycompany"}, features={"features/"})
public class RunApiTest {
}
Cucumber 步骤触发线程:email_bdd
@Then("^I should receive an email within (\d+) minutes$")
public void email_bdd(int arg1) throws Throwable {
Thread thread = new Thread(new ThreadedSteps(arg1));
thread.start();
}
线程 Class: ThreadedSteps
public class ThreadedSteps implements Runnable {
private int seconds_g;
public ThreadedSteps(Integer seconds) {
this.seconds_g = seconds;
}
@Override
public void run() {
Boolean result = waitForSecsUntilGmail(this.seconds_g);
}
public void pauseOneMin()
{
Thread.sleep(60000);
}
public Boolean waitForSecsUntilGmail(Integer seconds)
{
long milliseconds = seconds*1000;
long now = Instant.now().toEpochMilli();
long end = now+milliseconds;
while(now<end)
{
//do other stuff, too
pauseOneMin();
}
return true;
}
}
尝试 #1
我尝试将 join()
添加到我的线程,但这会停止我的主程序的执行,直到线程完成,然后继续执行程序的其余部分。这不是我想要的,我希望线程在主程序继续执行时休眠。
@Then("^I should receive an email within (\d+) minutes$")
public void email_bdd(int arg1) throws Throwable {
Thread thread = new Thread(new ThreadedSteps(arg1));
thread.start();
thread.join();
}
thread.join()
正是这样做的——它要求程序停止执行,直到该线程终止。如果你想让你的主线程继续工作,你需要把你的 join()
放在代码的底部。这样,主线程就可以完成它的所有任务,然后然后等待你的线程。
我正在尝试在我的 Cucumber-JVM 程序中创建一个新线程,当我达到某个 BDD 步骤时。
然后,一个线程应该做某事,而原始主线程继续 运行ning 通过黄瓜步骤。
在所有线程完成之前,程序不应退出。
我运行遇到的问题是主程序在线程结束前退出。
这是正在发生的事情:
输出/问题
- 主程序是
RunApiTest
- 线程 class 是
ThreadedSteps
。
这是我 运行 程序时发生的情况:
RunApiTest
开始执行所有步骤RunApiTest
达到 "I should receive an email within 5 minutes"RunApiTest
现在创建一个线程ThreadedSteps
,它应该休眠 5 分钟。ThreadedSteps
开始睡5分钟- 在
ThreadedSteps
睡觉时,RunApiTest
继续 运行Cucumber BDD 的剩余步骤 RunApiTest
完成并退出,无需等待ThreadedSteps
完成!
如何让我的程序等待直到我的线程完成?
这是我的代码
主黄瓜Class: RunApiTest
@RunWith(Cucumber.class)
@CucumberOptions(plugin={"pretty"}, glue={"mycompany"}, features={"features/"})
public class RunApiTest {
}
Cucumber 步骤触发线程:email_bdd
@Then("^I should receive an email within (\d+) minutes$")
public void email_bdd(int arg1) throws Throwable {
Thread thread = new Thread(new ThreadedSteps(arg1));
thread.start();
}
线程 Class: ThreadedSteps
public class ThreadedSteps implements Runnable {
private int seconds_g;
public ThreadedSteps(Integer seconds) {
this.seconds_g = seconds;
}
@Override
public void run() {
Boolean result = waitForSecsUntilGmail(this.seconds_g);
}
public void pauseOneMin()
{
Thread.sleep(60000);
}
public Boolean waitForSecsUntilGmail(Integer seconds)
{
long milliseconds = seconds*1000;
long now = Instant.now().toEpochMilli();
long end = now+milliseconds;
while(now<end)
{
//do other stuff, too
pauseOneMin();
}
return true;
}
}
尝试 #1
我尝试将 join()
添加到我的线程,但这会停止我的主程序的执行,直到线程完成,然后继续执行程序的其余部分。这不是我想要的,我希望线程在主程序继续执行时休眠。
@Then("^I should receive an email within (\d+) minutes$")
public void email_bdd(int arg1) throws Throwable {
Thread thread = new Thread(new ThreadedSteps(arg1));
thread.start();
thread.join();
}
thread.join()
正是这样做的——它要求程序停止执行,直到该线程终止。如果你想让你的主线程继续工作,你需要把你的 join()
放在代码的底部。这样,主线程就可以完成它的所有任务,然后然后等待你的线程。