2016-11-09 182 views
2

我想在我的Cucumber-JVM程序中創建一個新線程,當我達到某個BDD步驟時,創建一個新線程Java程序在線程完成之前退出。我如何讓Cucumber-JVM等待線程退出?

然後,一個線程應該做一些事情,而最初的主線程繼續貫穿黃瓜步驟。

程序不應該退出,直到所有線程都完成。

我遇到的問題是主程序在線程完成之前退出。

這裏發生的事情:


輸出/問題

  • 主程序RunApiTest
  • 線程類ThreadedSteps

這是當我運行該程序會發生什麼:

  1. RunApiTest開始通過所有準備步驟
  2. RunApiTest到達
  3. RunApiTest現在創建「我應該會在5分鐘之內收到一封電子郵件」一個線程ThreadedSteps,應該睡5分鐘。
  4. ThreadedSteps開始睡5分鐘
  5. 雖然ThreadedSteps正在睡覺,RunApiTest繼續運行黃瓜BDD的其餘步驟
  6. RunApiTest完成並退出,無需等待ThreadedSteps完成

如何讓我的程序等待,直到我的線程完成?


這裏是我的代碼

主要黃瓜類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(); 
} 

Thread類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(); 
} 

回答

2

thread.join()的確如此 - 它需要程序停止執行,直到該線程終止。如果你想讓你的主線程繼續工作,你需要把你的join()放在代碼的底部。這樣,主線程可以完成它的所有任務,然後然後等待你的線程。

+0

是的,我給'RunApiTest'添加了一個'@ AfterClass'並添加了'join()',並且它最後運行了,但是這個步驟的結果保存錯了......我想我只是要去改爲使用maven parellel插件。 https://github.com/temyers/cucumber-jvm-parallel-plugin – Kayvar