2016-11-09 1 views
2

私のCucumber-JVMプログラムで新しいスレッドを作成しようとしています。特定のBDDステップに到達すると、新しいスレッドが作成されます。スレッドが終了する前にJavaプログラムが終了します。 Cucumber-JVMがスレッドの終了を待つようにするにはどうすればよいですか?

その後、元のメインスレッドがキュウリのステップを実行し続けている間に、1つのスレッドが何かをしているはずです。

すべてのスレッドが終了するまでプログラムを終了しないでください。

スレッドが終了する前にメインプログラムが終了している問題があります。

はここで何が起こっているかである:


出力/問題

  • メインプログラムRunApiTest
  • ThreadedStepsあるスレッドクラスです。ここで

私はプログラムを実行すると何が起こるかです:

  • RunApiTestを「私は5分以内にメールを受信する」ことを得るRunApiTest
  • すべての工程を経る

    1. RunApiTest開始は今作成スレッドThreadedSteps、これは5分間スリープする必要があります。
    2. ThreadedSteps開始ThreadedStepsが眠っている間に5分
    3. のためにスリープ状態に、RunApiTestはキュウリBDDはを終了するThreadedStepsを待たずに
    4. 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(); 
    } 
    

    答えて

    2

    thread.join()これは、スレッドが終了するまでプログラムの実行を停止する必要があります。メインスレッドが作業を続行するようにするには、join()をコードの最後に配置する必要があります。そうすれば、メインスレッドはすべてのタスクを完了することができ、そしてスレッドを待つ。

    +0

    ええ、 'RunApiTest'に' @AfterClass'を追加して 'join()'を追加して最後に実行しましたが、ステップの結果が間違って保存されています...私はちょうど代わりにmaven parellelプラグインを使用してください。 https://github.com/temyers/cucumber-jvm-parallel-plugin – Kayvar

    関連する問題