Le package java.util.concurrent fournit des classes sur les opérations multi-thread. Ceux couramment utilisés sont EMMICRORSERVICE et ses classes d'implémentation (telles que ThreadPoolExecutor, etc.), l'exécuteur testamentaire, les exécuteurs, futur, callable, etc.
1. Interface ExecutorService (héritée de l'exécuteur): fournit des méthodes de fonctionnement multithreads asynchrones, telles que EXECUTE (), soumed (), shutdown (), shutdownnow (), etc.
2. Interface exécuteur: exécuter la tâche soumise (thread), avec une seule méthode exécutée (Runnable A)
2.
3. Interface Futre: représente le résultat de l'exécution du thread, fournit des méthodes pour obtenir le résultat d'exécution du thread et annuler des threads, tels que get (), cancle (), etc.
4. Interface appelable: le thread avec la valeur de retour est fourni par JDK1.5 pour exécuter une nouvelle interface
Faire des enregistrements simples de la compréhension du service exécutif et de l'avenir
Code:
classe publique Main {private static int count = 0; public static void main (String [] args) {list <future> resultList = new LinkedList <> (); / ** * exécuteurs.NewCachedThreadpool () Créez un pool de cache de thread. Si le thread n'est pas utilisé dans les années 60, le thread sera arrêté et supprimé de la piscine de cache * Exécuteurs.NewScheduledThreadPool () Créer un pool de threads avec une capacité fixe, et les threads à l'intérieur d'exécuter en fonction du jeu de planification de l'ensemble * Exécuteurs. Thread * / EMMIRESSERVICE EMMIRESSERVICE = EIMECTORORS.NEWCACHEDTHREADPOOL (); pour (int i = 0; i <10; i ++) {futur future = exécutorService.Submit (new Calable <string> () {@Override public String Call () {try {System.out.println (thread.currentThread (). Main.Count; resultList.add (futur); } EMMICRORSERVICE.SHUTDOWN (); pour (futur futur: resultList) {try {System.out.println (futur.get () + "..is over ..."); } catch (InterruptedException e) {e.printStackTrace (); } catch (EXECUTUTIONException e) {e.printStackTrace (); }} System.out.println ("Tire principal End ..."); }}Sortir:
Pool-1-thread-1pool-1-thread-2pool-1-thread-3pool-1-thread-4pool-1-thread-5pool-1-thread-6pool-1-thread-7pool-1-thread-8pool-1-thread-9pool-1-thread-10pool-1-thread-1..starte comptage: ... 0pool-1-thread-2..start Main Count: 0pool comptage: 0pool-1-thread-2.. Principal Count: ... 1pool-1-thread-2..end comptage principal: ... 1pool-1-thread-1..end comptage principal: ... 1pool-1-thread-3..end comptage principal: ... 1pool-1-thread-2..end comptage principal: ... 1pool-1-thread-1..end principal comptage: ... 1pool-1-thread-3..end principal: ... 2pool-1-thread-1..s ovel sur ... Pool-1-thread-4..Tarte Count principal: ... 2pool-1-thread-3..s a terminé ... Pool-1-thread-4..end le nombre principal: ... 3pool-1-thread-4..s od ... Pool-1-thread-5..start MAIN COMTY: ... 3pool-1-thread-5..end Main Count: ... 4pool-1-thread-5..s over ... Pool-1-1-thread-6..start semi Count: ... 4pool-1-thread-6..end le nombre principal: ... 4pool-1-thread-6..end comte principal: ... 4pool-1-thread-6..end comte principal: ... 4pool-1-thread-6..end comptage principal: ... 4pool-1-thread-6..end principal comptage: ... 5pool-1-thread-6..is over ... Pool-thread-7..end-1-1-thread-7..start Main Count: ... 5pool-1-piste-1-thread-7..start Main Count: ... 5pool-1-piste-1-thread-7..start Main Count: ... 5Pool-1-piste-1-thread-7..start Main Count: ... 5Pool-1-piste-1-thread-7..start Main Count: ... 5pool-1-piste-1-thread-7 .. Count: ... 6pool-1-thread-7..is fin ... Pool-1-thread-8..Tarter Count principal: ... 6pool-1-thread-8..end le nombre principal: ... 7pool-1-thread-8..is over ... Pool-1-thread-9..start Count principal: ... 7pool-1-thread-9..end Main Count: ... 8pool-1-1 Compte: ... 7pool-1-thread-9..end le nombre principal: ... 8pool-1-thread-9..s a terminé ... Pool-1-thread-10..start Main Count: ... 8pool-1-thread-9..s over ... Pool-1-thread-10..Tarter le nombre principal: ... 8Pool-1-thread-10..end Main Count: ... 9pool-1-thread-10..s over ... le thread principal se termine .../ le fil principal se termine après la fin de la fil exécution
La console imprime le résultat de sortie ci-dessus après avoir attendu 5 secondes. La raison en est que lorsque tous les threads commencent, c'est une opération simultanée et attendra 5 secondes. Donc, dans l'ensemble, il semble que cela n'ait attendu que 5 secondes. Il s'agit d'une opération simultanée.
Résumer:
1. La différence entre la méthode EXECUTE () et la méthode Soumide () fournie par ExecutorService:
un. La méthode EXECUTE () n'accepte que des instances de type Runnable, donc il ne peut pas obtenir la valeur de retour, ni ne peut obtenir dynamiquement la situation d'exécution du thread.
né La méthode Soumide () accepte les instances exécutables et appelables et renverra l'instance future. La méthode get () de l'instance future peut obtenir la valeur de retour d'exécution du thread et lancer des exceptions d'exécution de threads. Donc, si vous souhaitez obtenir le résultat renvoyé par l'exécution du thread et être en mesure de gérer les exceptions possibles pendant l'exécution du thread, ou si vous souhaitez annuler l'exécution du thread au milieu, vous pouvez utiliser la méthode Soumide ()
2. Grâce à la sortie, vous pouvez voir que la méthode principale (thread principal) se termine une fois que tous les threads ont terminé l'exécution. La raison:
un. Obtenez la future instance via la méthode Soumide () et obtenez le résultat de retour de thread via la méthode get () de l'instance future. La méthode get () de l'instance future attendra que le thread s'exécute avant de retourner, de sorte que la méthode principale attendra que tous les fils d'enfants se terminent avant la fin
né Si la boucle pour le rouge ci-dessus est supprimée, la méthode principale (thread principal) se terminera tôt sans attendre que tous les fils d'enfants se terminent
Remplir:
1. Lorsque plusieurs threads s'exécutent simultanément, si une exception se produit dans l'un des threads et n'est pas traitée, le thread arrêtera automatiquement l'exécution, mais les autres threads s'exécuteront toujours normalement. C'est pourquoi Tomcat peut continuer à fournir des services lorsqu'une exception se produit dans la demande de Tomcat.
2. Tomcat fournit une piscine en fil et une piscine en attente. Chaque demande redémarre un nouveau fil pour traiter la demande. Si les fils de la piscine de fil sont utilisés, il sera placé dans la piscine en attente et attendra. Lorsqu'un thread est relâché dans le pool de threads, un thread sera affecté pour traiter les demandes dans le pool d'attente.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.