Java程序在线程完成之前退出。如何让Cucumber-JVM等待线程退出?

时间:2016-11-09 23:06:03

标签: java multithreading cucumber cucumber-jvm cucumber-java

我想在我的Cucumber-JVM程序中创建一个新线程当我达到某个BDD步骤时。

然后,一个线程应该做某事,而原始主线程继续贯穿黄瓜步骤。

程序不应该退出,直到所有线程都完成。

我遇到的问题是主程序在线程完成之前退出。

以下是发生的事情:

输出/问题

  • 主程序RunApiTest
  • 主题类ThreadedSteps

以下是我运行程序时会发生的事情:

  1. RunApiTest开始执行所有步骤
  2. RunApiTest到达"我应该在5分钟内收到一封电子邮件"
  3. RunApiTest现在创建一个线程ThreadedSteps,应该睡5分钟。
  4. ThreadedSteps开始睡5分钟
  5. ThreadedSteps正在睡觉时,RunApiTest继续运行其余的黄瓜BDD步骤
  6. RunApiTest完成并退出,无需等待ThreadedSteps完成
  7. 如何在我的线程完成之前让我的程序等待?

    这是我的代码

    主要黄瓜类RunApiTest

    @RunWith(Cucumber.class)
    @CucumberOptions(plugin={"pretty"}, glue={"mycompany"}, features={"features/"})
    public class RunApiTest {
    }
    

    黄瓜步骤触发线程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();
    }
    

    主题类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();
    }
    

1 个答案:

答案 0 :(得分:2)

thread.join()正是如此 - 它要求程序暂停执行,直到该线程终止。如果您希望主线程继续工作,则需要将join()放在代码的底部。这样,主线程就可以完成它的所有任务,然后然后等待你的线程。