Je me suis retrouvé à penser à la résolution d'un problème de simultanéité, ce qui pour moi indique qu'il y a probablement une abstraction pour accomplir ce que je veux que je devrais utiliser à la place.Java Abstraction Abstraction for Work Queue
Voici la prémisse de base:
- J'ai une file d'attente de données que je peux faire le travail sur
- threads peuvent venir et ajouter du travail à la file d'attente
- Il y a une surcharge élevée associée avec départ et arrivée d'un ensemble d'éléments à travailler sur
- un seul thread peut travailler sur les données à la fois
je me suis dit l'API suivante serait bien:
- Threads peuvent ajouter du travail à la file d'attente
- Si les données de la file d'attente ne sont pas actuellement en cours d'élaboration, invoquez une tâche de fond pour commencer à travailler
- La tâche de fond continue à travailler sur la file d'attente jusqu'à ce qu'il soit vide, même si d'autres threads déposer des éléments supplémentaires pour travailler dans la file d'attente
la partie difficile est de garantir que les données ne siège pas dans la file d'attente ne sont pas travaillé dans le événement qu'un fil tombe d'un travail en même temps que le fil de travail est en train de finir.
Je suppose qu'il existe une abstraction pour résoudre ce problème. Quelqu'un en sait-il?
Edit:
Pour être plus précis, je parle d'une recherche incrémentale indexeur, et les données ajouté à la file d'attente est des documents supplémentaires à traiter. Quand je parle de démarrer et d'arrêter un groupe de travail, je fais référence à la construction d'un contexte de mise en cache et à la mise à jour d'un index. Nous ne pouvons pas exécuter un thread de travail à tout moment, car si nous ne validons jamais, le nouvel index ne sera jamais validé, et si nous ne fermons pas le contexte de mise en cache périodiquement, il peut devenir trop grand. Le but est que la plupart du temps, seulement quelques travaux sont traités à la fois, mais pendant les périodes de forte charge, nous ne perdons pas trop de temps à faire trop de commits.
Il y a donc un surcoût élevé à démarrer et à arrêter, mais vous pouvez ajouter à l'exécution en cours sans frais supplémentaires? Alors, n'arrêtez jamais votre course! :-D Mettez un occupé-attendez là, comme 'Thread.sleep (500);' peut-être. – corsiKa