Maison > Java > javaDidacticiel > Thread, exemple de tutoriel de création de thread

Thread, exemple de tutoriel de création de thread

零下一度
Libérer: 2017-06-25 09:35:59
original
1585 Les gens l'ont consulté

Thread principal : Le thread qui exécute la méthode principale est appelé le thread principal

Programme monothread : Le programme s'exécute séquentiellement de haut en bas en commençant from mani

Le programme commence à s'exécuter à partir de la méthode principale. Lorsque la JVM exécute la méthode principale, elle trouvera le système d'exploitation
et ouvrira un chemin d'exécution vers le processeur. à travers ce chemin.
Ce chemin a un Le nom est le fil principal

Méthode de création du fil 1 : Hériter de la classe Thread
Étapes de mise en œuvre :
1. Créer une sous-classe de la classe Thread
2. Réécrire La méthode run dans la classe Thread définit la tâche du thread
3. Créer un objet sous-classe de la classe Thread
4. Appeler la méthode start dans la classe Thread pour démarrer un nouveau thread et exécuter la méthode run
pour que le thread démarre l'exécution ; la machine virtuelle Java appelle la méthode run du thread.
Le résultat est que deux threads s'exécutent simultanément : le thread actuel (le thread principal) et l'autre thread (le thread exécutant la méthode run).
Démarrer un fil de discussion plusieurs fois est illégal. Surtout lorsqu'un thread a fini de s'exécuter, il ne peut pas être redémarré.

Les résultats imprimés apparaissent aléatoirement :
Ouvrez deux threads et choisissez le bon pour le CPU
Exécutez qui vous voulez pour que des résultats aléatoires apparaissent

 1 public class MyThread extends Thread{ 2     /* 3      * 2.重写Thread类中的run方法,设置线程的任务 4      * 开启这个线程要干什么事情 5      */ 6     @Override 7     public void run() { 8         for (int i = 0; i < 50; i++) { 9             System.out.println("run..."+i);10         }11     }12 }13     public static void main(String[] args) {14         //3.创建Thread类的子类对象15         MyThread mt = new MyThread();16         //mt.run();//不会开启线程,还是单线程程序17         //4.调用Thread类中的start方法开启一个新的线程,执行run方法18         mt.start();19         20         new MyThread().start();21         22         for (int i = 0; i < 50; i++) {23             System.out.println("main..."+i);24         }25     }
Copier après la connexion

Nom du fil de discussion :
Fil de discussion principal : "main"
Nom des autres fils de discussion ouverts : "Thread-0", "Thread-1"....

Obtenir le nom du fil de discussion
1. La méthode getName dans la classe Thread
String getName() renvoie le nom du fil.
2. Méthode statique dans la classe Thread pour obtenir le thread en cours d'exécution
static Thread currentThread() renvoie une référence à l'objet thread en cours d'exécution.
Définissez le nom du thread :
1. La méthode setName(String name) dans la classe Thread
void setName(String name) modifie le nom du thread afin qu'il soit identique au nom du paramètre.
2. Ajoutez une construction paramétrée à la sous-classe, appelez le constructeur paramétré de la classe Thread parent, transmettez le nom du thread et laissez la classe parent nommer le thread (laissez le père nommer son fils)
Thread (String name ) alloue un nouvel objet Thread.


Créer un mode thread - implémenter l'interface Runnable

Étapes d'implémentation :
1. Créer une classe d'implémentation de l'interface Runnable
2. Réécrire la méthode run dans le Interface Runnable, Définir les tâches du thread
3. Créez un objet de classe d'implémentation de l'interface Runnable
4. Créez un objet de classe Thread et transmettez la classe d'implémentation de l'interface Runnable dans le constructeur
Thread(Runnable target) alloue un nouvel objet Thread.
5. Appelez la méthode start dans la classe Thread pour démarrer le thread afin d'exécuter la méthode run


Avantages de l'implémentation de Runnable
1. Cela empêche une classe d'hériter de la classe Thread de hériter d'autres classes (Limitations de l'héritage unique)
2. Découpler la définition des tâches de thread et les threads de démarrage, améliorant ainsi l'évolutivité
Le rôle de la classe d'implémentation : définition des tâches de thread
Le rôle de la classe Thread : les threads de démarrage
Avantages : passez différentes classes d'implémentation, la méthode de réécriture de la classe d'implémentation est différente, vous pouvez appeler différentes méthodes

La classe interne anonyme du thread utilise

Anonyme : pas de nom
Classe interne : une classe écrite à l'intérieur d'autres classes (position du membre : classe interne membre, position locale (dans la méthode) : classe interne locale)

Format de la classe interne anonyme :
nouvelle classe/interface parent () {
Remplacer les méthodes dans la classe/interface parent ;
};

Classe parent multithread :
Thread
Runnable

1  new Thread(){2             //重写run方法,设置线程任务3             @Override4             public void run() {5                 for (int i = 0; i < 20; i++) {6                     System.out.println(Thread.currentThread().getName()+":"+i);7                 }8             }9         }
Copier après la connexion

Le la pile de code ci-dessus est un processus de création d'une sous-classe et de remplacement de la méthode de la classe parent
Équivalent à : new MyThread().start();

Le programme a un problème de sécurité des threads : vendu des tickets en double et tickets inexistants

Solution :
Première méthode : Vous pouvez utiliser un bloc de code synchronisé

synchronisé (objet de verrouillage) {
Code qui crée des problèmes de sécurité ;
Code qui accède aux données partagées;
>

Remarque :
Il est nécessaire de s'assurer que plusieurs threads utilisent le même objet de verrouillage
//Créer un objet de verrouillage à la position du membre Objet de verrouillage (garanti de être unique)

 1 Object obj = new Object(); 2      3     @Override 4     public void run() { 5         //让卖票重复执行 6         while(true){ 7          8              * 同步代码块 9              * 程序会频繁的判断锁,获取锁,释放锁,所以会降低速度10              11             synchronized (obj) {12                 if(ticket>0){13                     //为了提高安全问题的概率,让程序睡眠14                     try {15                         Thread.sleep(10);16                     } catch (InterruptedException e) {17                         e.printStackTrace();18                     }19                     //卖票ticket--20                     System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");21                 }22             }23         }24     }
Copier après la connexion

Le programme a un problème de sécurité des fils : des billets en double et des billets inexistants sont vendus

Solution :
La deuxième façon : Méthode synchronisée

Étapes d'utilisation :
1. Extrayez le code pouvant causer des problèmes de sécurité dans une méthode
2. Ajoutez un mot-clé synchronisé
modificateur au nom de la méthode du type de valeur de retour synchronisé ( paramètre) {
Code pouvant présenter des problèmes de sécurité;
Code accédant aux données partagées;
}

Quel est l'objet verrou utilisé par la méthode synchronisée?
Ce qui est utilisé est cet objet de classe new RunnableImpl()-->Appelez ceci

Méthode de synchronisation statique, quel objet de verrouillage est utilisé ?
Ce qui est utilisé est l'attribut de classe (réflexion) de cet objet de classe
RunnableImpl .class

 1 *@Override 2     public void run() { 3         //让卖票重复执行 4         while(true){ 5             payTicket2(); 6         } 7     } 8      9     10      * 静态的同步方法11      12     public static synchronized void payTicket2(){13         synchronized (RunnableImpl.class) {14             if(ticket>0){15                 //为了提高安全问题的概率,让程序睡眠16                 try {17                     Thread.sleep(10);18                 } catch (InterruptedException e) {19                     e.printStackTrace();20                 }21                 //卖票ticket--22                 System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");23             }24         }25     }26     27     28     29      * 抽取出一个同步方法30      * 快捷键:alt+shift+m31      32     public ynchronized void payTicket1() {33         synchronized (this) {34             //System.out.println(this);//cn.itcsat.demo10.RunnableImpl@6706435             if(ticket>0){36                 //为了提高安全问题的概率,让程序睡眠37                 try {38                     Thread.sleep(10);39                 } catch (InterruptedException e) {40                     e.printStackTrace();41                 }42                 //卖票ticket--43                 System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");44             }45         }46     }
Copier après la connexion

程序出现了线程安全问题:卖了重复的票和不存在的票
*
* 解决方案:
* 第三种方式:使用Lock接口,JDK1.5之后出现的
*
* java.util.concurrent.locks.Lock接口
* 方法:
* void lock() 获取锁。
* void unlock() 释放锁。  
*  接口的实现类:ReentrantLock
*  
* 实现步骤:
* 1.在成员位置创建一个Lock接口的实现类对象ReentrantLock
* 2.在可能出现线程安全问题的代码前,调用lock方法获取锁
* 3.在可能出现线程安全问题的代码后,调用unlock方法释放锁
*
*1.在成员位置创建一个Lock接口的实现类对象ReentrantLock
Lock l = new ReentrantLock();

 1 @Override 2     public void run() { 3         //让卖票重复执行 4         while(true){ 5             //2.在可能出现线程安全问题的代码前,调用lock方法获取锁 6             l.lock(); 7                 if(ticket>0){ 8                     //为了提高安全问题的概率,让程序睡眠 9                     try {10                         Thread.sleep(10);11                         //卖票ticket--12                         System.out.println(Thread.currentThread().getName()+"...卖第"+ticket--+"张票");13                     } catch (InterruptedException e) {14                         e.printStackTrace();15                     }finally {16                         //3.在可能出现线程安全问题的代码后,调用unlock方法释放锁17                         l.unlock();    
18                     }19                 }20         }
Copier après la connexion

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal