ホームページ >データベース >mysql チュートリアル >JavaFX アプリケーションでスレッドを正しく処理するにはどうすればよいですか?
JavaFX のスレッド処理について
JavaFX では、スレッド処理に 2 つの重要なルールが課されます。
ルール 1 (GUI スレッド処理) ):
JavaFX シーン内のノードとの対話グラフは JavaFX アプリケーション スレッドで発生する必要があります。このスレッドは、ユーザー イベントのレンダリングと処理の両方を担当します。
ルール 2 (バックグラウンド スレッド):
UI の応答不能を防ぐために、長時間実行される操作はバックグラウンド スレッドで実行する必要があります。
javafx.concurrent によるスレッド化API
JavaFX は、バックグラウンド操作を管理するための Task クラスを提供します。タスクには、別のスレッドで実行される call() メソッドがあります。完了すると、タスクは succeeded() および failed() イベント ハンドラーを使用して UI 要素を更新できます。これらのハンドラーは FX アプリケーション スレッドで呼び出され、ルール 1 への準拠が保証されます。
例: スレッドによるデータベース アクセス
データベース クエリの例を取り上げて実装してみましょう。スレッドを使用します。
データ アクセス オブジェクト (DAO)クラス:
public class CourseDAO { private Connection conn; public CourseDAO() throws Exception { // Establish database connection } public Course getCourseByCode(int code) throws SQLException { try (PreparedStatement stmt = conn.prepareStatement("SELECT * FROM course WHERE c_code = ?")) { stmt.setInt(1, code); ResultSet rs = stmt.executeQuery(); if (rs.next()) { // Create and populate a Course object } else { // Handle case where course doesn't exist } } } }
コントローラー クラス:
@FXML private TextField courseId; @FXML private Label courseCodeLbl; private CourseDAO courseDAO; @FXML public void getCourseOnClick() { final int courseCode = Integer.valueOf(courseId.getText()); Task<Course> courseTask = new Task<>() { @Override protected Course call() throws Exception { return courseDAO.getCourseByCode(courseCode); } }; courseTask.setOnSucceeded(e -> { Course course = courseTask.getValue(); if (course != null) { courseCodeLbl.setText(course.getName()); } }); // Execute the task on a background thread exec.execute(courseTask); }
この例では、データベース クエリはルール 2 に従って別のスレッドで実行されます。完了後、UI はルール 1 に従って FX アプリケーション スレッドで更新されます。
以上がJavaFX アプリケーションでスレッドを正しく処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。