Thread de comparaison de threads Java, coulant, appelant
Java utilise la classe de threads pour représenter les threads, et tous les objets de champ doivent être des instances de la classe de threads ou de sa sous-classe. La fonction de chaque thread est de terminer une certaine tâche, qui consiste en fait à exécuter un flux de programme. Java utilise des corps d'exécution de threads pour représenter ce flux de programme.
1. Hériter de la classe de threads pour créer du thread
Les étapes pour démarrer le multithreading sont les suivantes:
(1) Définissez la sous-classe de la classe de thread et remplacez la méthode run () de la classe. Le corps de la méthode de la méthode run () représente les tâches que le thread de classe doit effectuer. Par conséquent, la méthode run () est appelée le corps d'exécution du thread.
(2) Créez une instance de la sous-classe de thread, c'est-à-dire créer un objet de thread.
(3) Appelez la méthode Star () du thread pour démarrer le thread.
Les codes pertinents sont les suivants:
/ ** * Hériter de la classe intérieure du fil pour acheter des billets par exemple * / classe publique FirstThread étend Thread {private int i; ticket int privé = 10; @Override public void run () {for (; i <20; i ++) {// Lors du thread héritant, utilisez-le directement pour obtenir le thread actuel, getName () Obtenez le nom du thread actuel // log.d (tag, getName () + "" + i); if (this.ticket> 0) {log.e (tag, getName () + ", Sell Selling: Ticket =" + Ticket--); }}}} private void startICKetThread () {log.d (tag, "startIcketThread," + thread.currentThread (). getName ()); FirstThread Thread1 = new FirstThread (); FirstThread Thread2 = new FirstThread (); FirstThread Thread3 = new FirstThread (); thread1.start (); thread2.start (); thread3.start (); // Ouvre 3 fils pour acheter des billets, chaque fil a vendu 10 billets et un total de 30 billets}Résultats en cours:
Vous pouvez voir que les variables de vote entrées par 3 threads ne sont pas continues. Remarque: le ticket est une propriété d'instance de FirstThread, pas une variable locale, mais comme le programme doit créer un objet FirstThread chaque fois qu'il crée un objet de thread, tous les threads multiples ne partagent pas les attributs de l'instance.
2. Implémentez l'interface Runnable pour créer des threads
Remarque: le thread de classe publique implémente RANNABLE
(1) Définissez la classe d'implémentation de l'interface Runnable et remplacez la méthode run () de l'interface. Le corps de la méthode de la méthode run () est également le corps d'exécution du thread du thread.
(2) Créez une instance de la classe d'instance Runnable. Cette instance est utilisée comme cible de thread pour créer un objet de thread. L'objet thread est l'objet réel.
Les codes pertinents sont les suivants:
/ ** * Implémentez l'interface Runnable et créez une classe de threads * / classe publique SecondThread implémente Runnable {private int i; Ticket INT privé = 100; @Override public void run () {for (; i <20; i ++) {// Si la classe de thread implémente l'interface Runnable // Obtenez le thread actuel, vous ne pouvez utiliser que Thread.currentThread () pour obtenir le nom de thread actuel Log.d (tag, thread.currentThread (). GetName () + "" + i); if (this.ticket> 0) {log.e (tag, thread.currentThread (). getName () + ", Sell Selling: Ticket =" + Ticket--); }}}} private void startICKetThread2 () {log.d (tag, "startIcketThread2," + thread.currentThread (). getName ()); SecondThread Secondthread = new SecondThread (); // Créez un nouveau thread via un nouveau thread (cible, nom) nouveau thread (SecondThread, "Ticket Buyer 1"). Start (); nouveau thread (Secondthread, "Ticket Buyer 2"). start (); Nouveau thread (Secondthread, "Ticket Buyer 3"). start (); // Bien que 3 fils aient été ouverts, seuls 100 billets ont été achetés au total}Résultats en cours:
Vous pouvez voir que les variables de vote entrées par 3 threads sont continues et que plusieurs threads peuvent partager les propriétés de l'instance de la classe de threads à l'aide de l'interface Runnable. En effet, de cette manière, l'objet Runnable créé par le programme n'est que la cible d'un thread, et plusieurs threads peuvent partager la même cible, de sorte que plusieurs threads peuvent partager les propriétés d'instance de la même classe de threads (qui devrait en fait être la classe cible du thread).
3. Créez des threads en utilisant des appels et futurs
À partir de Java 5, Java fournit une interface appelée, qui est une version améliorée de Runnable. Calable fournit une méthode de classe appelée () qui peut être utilisée comme corps d'exécution de thread, mais la méthode Call () est plus puissante.
(1) La méthode Call () peut avoir une valeur de retour (2) La méthode Call () peut déclarer une exception lancée
Par conséquent, nous pouvons fournir un objet appelable comme cible de thread, et l'exécuteur exécuteur du thread est la méthode Call () de l'objet appelant. Dans le même temps, Java 5 fournit la future interface pour représenter la valeur de retour de la méthode Call () dans l'interface appelée et fournit une classe d'implémentation FutureTask. Cette classe d'implémentation implémente l'interface future et implémente l'interface Runnable - une cible qui peut être utilisée comme classe de thread.
Les étapes de démarrage sont les suivantes:
(1) Créez une classe d'implémentation de l'interface callable et implémentez la méthode Call (). La méthode Call () sera utilisée comme corps d'exécution du thread, et la méthode Call () a une valeur de retour.
(2) Créez une instance de la classe d'implémentation callable et utilisez la classe FutureTask pour envelopper l'objet appelable. L'objet FutureTask résume la valeur de retour de la méthode Call ().
(3) Créez et démarrez un nouveau thread à l'aide de l'objet FutureTask comme cible de l'objet de thread.
(4) Appelez la méthode get () de l'objet Futuretask pour obtenir la valeur de retour une fois le thread enfant exécuté.
Les codes pertinents sont les suivants:
/ ** * Utilisez Calable pour implémenter la classe de threads * / classe publique ThirdThread implémente Calable <Integer> {private int billettez = 20; @Override public Integer Call () {for (int i = 0; i <10; i ++) {// Obtenez le thread actuel, vous pouvez uniquement utiliser thread.currentThread () pour obtenir le nom de thread actuel // log.d (tag, thread.currenthread (). GetName () + "" + i); if (this.ticket> 0) {log.e (tag, thread.currentThread (). getName () + ", billets: ticket =" + ticket--); }} Retour Ticket; }} private void starCallableThread () {ThirdThread ThirdThread = new ThirdThread (); FutureTask <Integer> task = new FutureTask <Integer> (ThirdThread); Nouveau thread (tâche, "Thread with Return Value"). start (); essayez {entier entier = tâche.get (); Log.d (tag, "starCallableThread, la valeur de retour de l'enfant thread =" + entier); } catch (InterruptedException e) {e.printStackTrace (); } catch (EXECUTUTIONException e) {e.printStackTrace (); }}Résultats en cours:
Remarque: la méthode Call () de Callable permet aux déclarations de lancer des exceptions et permet les valeurs de retour.
Le programme appelle enfin la méthode GET () de l'objet FutureTask pour renvoyer la valeur de retour de la méthode Call (), ce qui fait bloquer le thread principal jusqu'à ce que la méthode Call () se termine et revient.
4. Comparaison de trois façons
Créer le multi-lancement en héritage de classe de threads
Inconvénients: la classe de threads a été héritée ne peut pas être héritée des autres classes parentales.
Avantages: simple à écrire
Créer un multi-threading en utilisant la méthode d'héritage des interfaces coulables et appelables
Inconvénients: La programmation est un peu compliquée. Si vous devez accéder au thread actuel, vous devez utiliser thread.currentThread ()
Avantages:
(1) Il peut également hériter d'autres classes (2) plusieurs threads peuvent partager un objet cible, il est donc très adapté à plusieurs threads identiques pour gérer la même ressource, séparant ainsi le CPU, le code et les données pour former un modèle clair, qui reflète mieux l'idée orientée objet de classe.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!