2016-09-27 8 views
2

ループ内に新しいスレッドを作成する方法をアドバイスできますか?データはデータベースから取得され、各行が新しいスレッドで処理されるようにしたい。すべてがコントローラのJavaFXで行われます。おそらくサービスを使用する必要がありますが、私はこのアプローチの例を見つけることができません。事前に感謝しますJavaFX、ループ内にスレッドを作成する

答えて

2

すべての行に新しいスレッドを作成してもよろしいですか?百万行がある場合は、100万スレッドがあります。

Task task = new Task<Void>() { 

    @Override 
    public Void call() { 
     ResultSet rs = ...; 
     int max = getSizeOfResultSet(rs); 
     int count = 0; 
     while (rs.next()) { 
      if (isCancelled()) { 
       break; 
      } 
      updateProgress(count++, max); 
     } 
     return null; 
    } 
}; 
yourProgressBarIfYouHaveOne.progressProperty().bind(task.progressProperty()); 
new Thread(task).start(); 

task.setOnSucceeded(event -> { 
    System.out.println("OK, all done!"); 
    releaseUserInterface(); 
}); 
+0

私がしたい:

ResultSet rs = ...; while (rs.next()) { new Thread(() -> { doSomething(); Platform.runLater(() -> doSomethingThatUpdatesUI()); }).start(); } 

更新javafx.concurrent.Task(一つだけのスレッド作成)を使用して

例: もしそうなら、それはこのような単純なする必要がありますすべての新しいスレッドに追加します。これは、単一のアプリケーションがデータを読み取るまで完全に正しく機能しないためです。スレッドごとにオンとオフを切り替える必要があります。私はそれがよりスムーズな操作になることを願っています。そして、このようにして、JavaFXのために推奨されているように、私はタスクまたはサービスで何かを見つけようとしたため、試していません。 – programmerJavaPL

+0

(javafx.concurrentパッケージの)タスクが必要な場合は、ONEタスクのみを実行することをお勧めします(https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htmを参照)。私は答えを例文で更新します –

+0

前の方法としてはうまくいかない話題はどれですか?だから、何度か走れる「サービス」を使う方が良いでしょうか?ドキュメントは共有されていません – programmerJavaPL

関連する問題