Maison > Java > javaDidacticiel > Comment implémenter correctement le threading pour les requêtes de base de données dans JavaFX afin d'éviter le blocage de l'interface utilisateur ?

Comment implémenter correctement le threading pour les requêtes de base de données dans JavaFX afin d'éviter le blocage de l'interface utilisateur ?

Susan Sarandon
Libérer: 2024-12-26 10:20:12
original
526 Les gens l'ont consulté

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

Implémentation du threading pour les requêtes de base de données

Vous rencontrez une exception en raison de l'accès à l'interface utilisateur JavaFX à partir d'un thread distinct. Voici comment implémenter correctement le threading :

Principes généraux du threading dans JavaFX

  • Règle 1 :Toute modification ou accès au graphe de scène doit être effectué sur le fil de discussion de l'application FX.
  • Règle 2 : Les opérations de longue durée doivent être exécutées sur Threads d'application non FX.

Implémentation à l'aide de Threads

Créez un fil de discussion et démarrez la requête de base de données dessus :

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

t.start();
Copier après la connexion

Utilisation de l'API simultanée JavaFX

L'API javafx.concurrent fournit un moyen pratique de gérer les threads en arrière-plan et de mettre à jour les UI.

  • Tâche : Encapsuler l'opération en arrière-plan.
  • Thème de tâche en arrière-plan : Exécute la méthode call() de la tâche en arrière-plan thread.
  • Thème d'application FX : Met à jour l'interface utilisateur à la fin via gestionnaires d'événements enregistrés dans Task.

Exemple d'utilisation de WidgetDAO et 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);
    }
}
Copier après la connexion

Exemple d'utilisation de MyDAO et 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);
    }
}
Copier après la connexion

En implémentant correctement le threading, vous vous assurez que les requêtes de base de données de longue durée ne bloquent pas le thread de l'interface utilisateur, ce qui donne une interface utilisateur réactive.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal