Files
Documentation/content/core-concepts/tasks/_index.fr.md
2026-01-20 20:33:59 +01:00

2.4 KiB

title, type, weight
title type weight
Tâches docs 3

Le système de tâches dans Hytale gère les opérations asynchrones en utilisant les APIs de concurrence standard de Java.

{{< cards >}} {{< card link="task-registry" title="TaskRegistry" subtitle="Enregistrement et suivi des tâches" >}} {{< card link="async-operations" title="Opérations Async" subtitle="Patterns async thread-safe" >}} {{< /cards >}}

Aperçu

{{< callout type="warning" >}} Important : TaskRegistry n'a PAS de méthodes runAsync(), runSync(), runLater(), ou runRepeating(). Hytale utilise les APIs standard Java CompletableFuture et ScheduledExecutorService. {{< /callout >}}

Le TaskRegistry permet aux plugins de :

  • Enregistrer des tâches - Suivre les CompletableFuture et ScheduledFuture pour le nettoyage
  • Opérations async - Utiliser CompletableFuture.runAsync()
  • Opérations différées - Utiliser CompletableFuture.delayedExecutor()
  • Opérations répétitives - Utiliser ScheduledExecutorService

Démarrage Rapide

// Exécuter une opération async
CompletableFuture.runAsync(() -> {
    // Code thread d'arrière-plan
    Data result = computeExpensiveData();

    // Retourner au thread du monde pour les changements d'état du jeu
    world.execute(() -> {
        playerRef.sendMessage(Message.raw("Résultat : " + result));
    });
});

// Opération différée (3 secondes)
CompletableFuture.delayedExecutor(3, TimeUnit.SECONDS)
    .execute(() -> {
        world.execute(() -> {
            // Code différé sur le thread du monde
        });
    });

Concepts Clés

{{< callout type="warning" >}} Sécurité des Threads : Chaque World s'exécute sur son propre thread dédié. Utilisez toujours world.execute() lors de la modification de l'état du jeu (joueurs, entités, blocs) depuis du code async. La manipulation directe depuis des threads async peut causer des crashs ou corruption de données. {{< /callout >}}

// Pattern correct
PlayerRef playerRef = player.getPlayerRef();
World world = player.getWorld();

CompletableFuture.runAsync(() -> {
    // Faire le calcul lourd ici (thread d'arrière-plan)
    Data result = computeExpensiveData();

    // Retourner au thread du monde pour les changements d'état du jeu
    world.execute(() -> {
        playerRef.sendMessage(Message.raw("Résultat : " + result));
    });
});