ホームページ > Java > &#&チュートリアル > UI のブロックを回避するために JavaFX でデータベース リクエストのスレッドを適切に実装するにはどうすればよいですか?

UI のブロックを回避するために JavaFX でデータベース リクエストのスレッドを適切に実装するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-26 10:20:12
オリジナル
526 人が閲覧しました

How to Properly Implement Threading for Database Requests in JavaFX to Avoid UI Blocking?

データベースリクエストのスレッド化の実装

別のスレッドから JavaFX UI にアクセスすると例外が発生します。スレッド化を正しく実装する方法は次のとおりです。

JavaFX でのスレッド化の一般原則

  • ルール 1: シーン グラフへの変更またはアクセスは、次の場所で実行する必要があります。 FX アプリケーション スレッド。
  • ルール 2:長時間実行される操作は、FX 以外のアプリケーション スレッドで実行する必要があります。

スレッドを使用した実装

スレッドを作成し、その上でデータベース リクエストを開始します:

Thread t = new Thread(new Runnable() {
    public void run() {
        requestCourseName();
    }
}, "Thread A");

t.start();
ログイン後にコピー

JavaFX Concurrent API の使用

javafx.concurrent API は、次のような便利な方法を提供します。バックグラウンド スレッドを管理し、UI を更新します。

  • タスク: バックグラウンド操作をカプセル化します。
  • バックグラウンド タスク スレッド: タスクの呼び出しを実行しますバックグラウンド スレッドの () メソッド。
  • FX アプリケーションスレッド: Task に登録されたイベント ハンドラーを介して完了時に UI を更新します。

WidgetDAO と Task を使用した例

// DAO encapsulates database access
public class WidgetDAO {
    public List<Widget> getWidgetsByType(String type) { ... }
}

// Controller handles UI operations
public class MyController {
    private WidgetDAO widgetAccessor;
    private Executor exec;

    public void searchWidgets() {
        String searchString = widgetTypeSearchField.getText();
        Task<List<Widget>> widgetSearchTask = new Task<>() {
            @Override
            protected List<Widget> call() throws Exception {
                return widgetAccessor.getWidgetsByType(searchString);
            }
        };

        widgetSearchTask.setOnSucceeded(e -> widgetTable.getItems().setAll(widgetSearchTask.getValue()));
        exec.execute(widgetSearchTask);
    }
}
ログイン後にコピー

MyDAO と Task を使用した例

// DAO encapsulates database access
public class MyDAO {
    public Course getCourseByCode(int code) { ... }
}

// Controller handles UI operations
public class MyController {
    private MyDAO myDAO;
    private Executor exec;

    public void searchCourse() {
        int courseCode = Integer.valueOf(courseId.getText());
        Task<Course> courseTask = new Task<>() {
            @Override
            protected Course call() throws Exception {
                return myDAO.getCourseByCode(courseCode);
            }
        };

        courseTask.setOnSucceeded(e -> {
            Course course = courseTask.getValue();
            courseCodeLbl.setText(course.getName());
        });
        exec.execute(courseTask);
    }
}
ログイン後にコピー

スレッドを正しく実装することで、長時間実行されるデータベース リクエストによって UI スレッドがブロックされなくなり、応答性の高いユーザー インターフェイス。

以上がUI のブロックを回避するために JavaFX でデータベース リクエストのスレッドを適切に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート