私のCucumber-JVMプログラムで新しいスレッドを作成しようとしています。特定のBDDステップに到達すると、新しいスレッドが作成されます。スレッドが終了する前にJavaプログラムが終了します。 Cucumber-JVMがスレッドの終了を待つようにするにはどうすればよいですか?
その後、元のメインスレッドがキュウリのステップを実行し続けている間に、1つのスレッドが何かをしているはずです。
すべてのスレッドが終了するまでプログラムを終了しないでください。
スレッドが終了する前にメインプログラムが終了している問題があります。
はここで何が起こっているかである:
出力/問題
- メインプログラムが
RunApiTest
- が
ThreadedSteps
あるスレッドクラスです。ここで
私はプログラムを実行すると何が起こるかです:
RunApiTest
を「私は5分以内にメールを受信する」ことを得るRunApiTest
RunApiTest
開始は今作成スレッドThreadedSteps
、これは5分間スリープする必要があります。ThreadedSteps
開始ThreadedSteps
が眠っている間に5分- のためにスリープ状態に、
RunApiTest
はキュウリBDDはを終了するThreadedSteps
を待たずに RunApiTest
終了して終了、を残りのステップを実行し続けます!
スレッドが完了するまでプログラムWAITを作成するにはどうすればよいですか?ここで
私のコード
メインキュウリクラスです: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();
}
:スレッドをトリガするために
RunApiTest
@RunWith(Cucumber.class)
@CucumberOptions(plugin={"pretty"}, glue={"mycompany"}, features={"features/"})
public class RunApiTest {
}
キュウリのステップの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();
}
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;
}
}
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();
}
ええ、 'RunApiTest'に' @AfterClass'を追加して 'join()'を追加して最後に実行しましたが、ステップの結果が間違って保存されています...私はちょうど代わりにmaven parellelプラグインを使用してください。 https://github.com/temyers/cucumber-jvm-parallel-plugin – Kayvar