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
CompletableFutureetScheduledFuturepour 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));
});
});