Selon exactement ce que votre processus est, vous pourriez ne pas avoir besoin de faire threading (qui, croyez-moi, est quelque chose que vous auriez plutôt éviter si possible, peu importe comment cool et amusant les grands enfants font pour être).
Une façon d'aborder le problème consiste à configurer une file d'attente d'événements.
dans pseudocode
enum EVENTTYPES = {PEEL=0, WORK=1};
struct Event = {
int eventType;
int* data;
}
filoQueue eventQueue;
array sQuidPlayers = [new Squid(), new Squid(), new Squid()];
void eventLoop() {
int player;
for each player in sQuidPlayers {
eventQueue.push(new Event(EVENTTYPES.WORK, player.id));
}
for each event in eventQueue {
game.doEvent(event)
}
}
Alors là, vous exécutez la boucle d'événements 25 fois, 30 fois ou 60 fois par seconde, quelle que soit la fréquence d'images que vous souhaitez fonctionner à. Vous utilisez une minuterie pour cela (je suis sûr qu'il y en a une dans Java quelque part)
Ensuite, doEvent va essayer de trouver une méthode de co-réponse sur l'instance du lecteur correspondant. La méthode de travail sur la classe Squid fera une minuscule parcelle de travail, puis s'arrêtera, attendant la prochaine fois dans la boucle. Chaque Squid dans le tableau obtient son tour de faire leur petit travail. La méthode de travail, à son tour, PEUT mettre un événement PEEL sur la file d'attente des événements.À ce moment, la prochaine fois autour de la boucle, une méthode de peel cooresponding peut être appelée. Peut-être sur une classe de jeu central, avec l'ID du joueur qui a créé l'événement de pelage. Vous mettez la logique de la manière d'envoyer ces événements dans la méthode doEvent. doEvent peut à son tour transmettre un objet à chaque récepteur d'événement, de sorte que le destinataire peut placer ses propres objets d'événement dans la file d'attente pour être exécuté la prochaine fois autour de la boucle. (alternativement, la boucle "pour chaque événement" s'exécute jusqu'à ce que la file d'attente soit vide, et cela inclut les nouveaux événements ajoutés par les précédents appels à doEvent, donc un nouvel événement peut être appelé immédiatement au lieu d'attendre la prochaine animation). L'astuce consiste à trouver comment décomposer votre long travail en une petite parcelle de travail, à trouver comment enregistrer les résultats de ce travail et à le reprendre plus tard là où vous l'avez laissé la prochaine fois que la méthode de travail est appelée. Si tous les joueurs se comportent bien, ils peuvent tous partager un fil sans se bloquer.
Si vous allez descendre le chemin fileté, les questions sur qui peut accéder à quel peu de mémoire et quand un peu plus compliqué.