2016-10-04 12 views
1

Taskを複数回(=同じServiceは複数の並列化を実行する必要があります)Taskを起動するServiceを使用する必要があります。私はJavaFXのドキュメントを読んで、Serviceは1度に1つだけTaskを実行できると言うようです。サービスはいくつかのタスクを開始できますか?

私は二回startServiceオブジェクトで呼び出す場合、私は最初のstartrestartを使用しているかのようので、そのcreateTaskメソッドによって返された最初のTaskは、停止されるだろう。

しかし、それは明確ではありません。私が言ったように、ドキュメントと思われます。 実際:

サービスは、バックグラウンドスレッドで作業を実行するタスクを作成および管理します。私は、彼らはまた、ServiceTaskいくつかが同時に開始していることができると言う考えることができ

注意。事実:

aサービスは、宣言的に構築し、必要に応じて再起動することができます。

私の質問はです:私はN startが連続して使用する場合、N Tasksが作成され、各実行し続けることでしょうか? "私はN使用する場合は、行の開始Nタスクが作成され、各実行したまま?要するに

、ない。

" 私は二回startを呼び出す場合

答えて

3

私のServiceオブジェクト...」Javadocsから

public void start()

開始します。このサービス。この呼び出しで成功するには、サービスがREADY状態でなければなりません。

以前reset()を呼び出すことなく、第2の時間start()を呼び出すのであれば、あなただけの例外が発生します。 ServiceRUNNINGまたはSCHEDULEDの州にない場合にのみreset()に電話をかけることができます。 restart()に電話をかけると、は現在のタスクを最初に取り消してからサービスを再起動します。 (これは、「オンデマンドでサービスを再開できる」という文書が意味するものです)。

この結果、サービスは現在実行中のタスクを2つ同時に持つことはできません。 IllegalStateExceptionを投げずにその状況に到達できる一連のコール。

一度に実行する複数のタスクをしたい場合は、単にそれらを自分で作成して、エグゼキュータに提出(または独自のスレッドでそれぞれ実行されますが、エグゼキュータが好ましい):あなたより

private final Executor exec = Executors.newCachedThreadPool(runnable -> { 
    Thread t = new Thread(runnable); 
    t.setDaemon(true); 
    return t ; 
}); 

// ... 

private void launchTask() { 

    Task<MyDataType> task = new Task<MyDataType>(){ 
     @Override 
     protected Something call() { 
      // do work... 
      return new MyDataType(...); 
     } 
    }; 
    task.setOnSucceeded(e -> { /* update UI ... */ }); 
    task.setOnFailed(e -> { /* handle error ... */ }); 
    exec.execute(task); 

} 
+0

! JavaFXアプリケーションスレッドがサービスの状態が "成功"になるのを待たせることができるかどうかは分かりますか?この状態になると、唯一のスレッドでいくつかのタスクを実行することができます(最後のタスクとJavaFXアプリケーションスレッドの間を除く、並列性はありません)。 –

+0

JavaFXアプリケーションスレッドをブロックしないでください。 –

+0

さて、 JFXドキュメントは、Executorをサービスに追加できることを示しています。あなたは私のサービス+タスク+後者を利用するエグゼクティブを組み合わせることができると思いますか? (私は実際に私のサービスを維持したいと思う) –

関連する問題