---
title: Tâches
type: docs
weight: 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

```java
// 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 >}}

```java
// 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));
    });
});
```
