Maison >Java >javaDidacticiel >Java : exemples détaillés de processus et de threads
Processus et threads
Un processus est le processus d'exécution d'un programme (tâche) et il est dynamique ; il contient des ressources (mémoire partagée, fichiers partagés) et les threads , est le transporteur de ressources et de threads.
Le thread est la plus petite unité d'exécution du système. Il existe plusieurs threads dans le même processus et les threads partagent les ressources du processus.
L'interaction des fils de discussion inclut l'exclusion mutuelle et la synchronisation.
Méthodes courantes des threads
La prise en charge des threads par Java se reflète principalement dans la classe Thread et l'interface Runnable, qui héritent toutes deux de Java Package .lang. Il existe une méthode courante run()
Méthodes d'erreur d'arrêt de thread : stop(), interruption()
La bonne façon d'arrêter un fil de discussion
public class ArmyRunnable implements Runnable {//volatile保证了线程可以正确读取其他线程写入的值volatile boolean keepRunning = true; @Overridepublic void run() {while(keepRunning) {//发动五连击for (int i = 0; i < 5 ; i++) { System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]"); }//暂停 Thread.yield(); } System.out.println(Thread.currentThread().getName() + "结束了战斗"); } }
Conditions de course
Lorsque plusieurs threads partagent l'accès aux mêmes données (zone mémoire) en même temps, chaque thread tente d'exploiter les données, provoquant la corruption des données. Ce phénomène est appelé une condition de concurrence.
Interaction des threads : exclusion mutuelle et synchronisation
Exclusion mutuelle : en même temps, un seul thread peut traiter nos données clés ou section critique pour fonctionner.
Implémentation de l'exclusion mutuelle : sysnchronized (verrouillage intrinsèque), sysnchronized équivaut à ajouter un verrou au code afin que les autres threads ne puissent pas entrer dans cette zone critique pour accéder à nos ressources clés.
Synchronisation : il s'agit d'un mécanisme de communication entre les threads. Parce que certaines conditions d'un thread ne sont pas remplies, d'autres threads sont dans un certain état d'attente. Plus tard, parce que les conditions sont remplies, un thread utilisera une sorte de. méthode pour réveiller d’autres threads.
Implémentation de la synchronisation : wait()/notify()/notifyAll()--méthode membre de l'objet Object
Wait set est la salle de repos du thread
public void transfer(int from, int to, double amount) {//通过synchronized 关键字来实现互斥,synchronized既可以出现在方法之上,也能以块的形式出现在方法体之中//通过对lockObj加锁实现互斥//加锁操作是有开销的,多次加锁操作会降低系统的性能synchronized (lockObj) {//while循环,保证条件不满足时任务都会被条件阻挡,而不是继续竞争CPU资源while (energyBoxes[from] < amount) {try {//条件不满足,将当前线程放入锁对象(lockObj)上的wait set//wait set 是线程的休息室 lockObj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()); energyBoxes[from] -= amount; System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to); energyBoxes[to] += amount; System.out.printf("能量总和:%10.2f%n",getTotalEnergies()); //唤醒所有在lockObj对象上等待的线程 lockObj.notifyAll(); } }
La différence entre la méthode Runnable et la méthode Thread pour créer des threads
Méthode exécutable Elle peut éviter les défauts causés par la méthode Thread en raison de la fonctionnalité d'héritage unique de Java
Le code exécutable peut être partagé par plusieurs threads (instances de Thread), adapté pour que plusieurs threads traitent la même ressource situation
Cycle de vie du thread
Prêt : après avoir créé l'objet thread, la méthode start() du thread est appelée (à ce moment, le thread entre simplement dans la file d'attente des threads, en attendant d'obtenir les services CPU, et a les conditions pour rouler, mais il n'a pas forcément démarré) .
En cours d'exécution : une fois que le thread à l'état prêt obtient la ressource CPU, il entre dans l'état d'exécution et commence à exécuter la logique dans la méthode run().
Terminaison : une fois que la méthode run() du thread est exécutée ou que le thread appelle la méthode stop() (cette méthode a été désactivée), le thread entre dans l'état terminé.
Blocage : dans certaines circonstances, un thread en cours d'exécution abandonne temporairement les ressources du processeur pour une raison quelconque, suspend sa propre exécution et entre dans un état de blocage, tel que la méthode sleep()
thread utilisateur et thread démon
thread utilisateur : s'exécute au premier plan et effectue des tâches spécifiques , comme le thread principal du programme et les sous-threads connectés au réseau
Thread démon : s'exécute en arrière-plan et sert les autres threads de premier plan une fois que tous les threads utilisateur sont terminés. opération, le thread démon terminera son travail avec la JVM.
Application du thread démon : surveillance du thread dans le pool de connexions à la base de données, surveillance du thread après le démarrage de la machine virtuelle JVM. Le thread démon le plus courant est le thread de récupération de place
Définir le thread démon : définissez le thread actuel comme thread démon en appelant la méthode setDaemon(true) de la classe Thread. Remarque : setDaemon(true) doit être appelé avant la méthode start(), sinon une exception sera levée ; le nouveau thread généré dans le thread démon est également un thread démon, toutes les tâches ne peuvent pas être assignées aux threads démon pour l'exécution, par exemple ; comme opérations de lecture et d’écriture. Ou logique de calcul.
Extensions
Mode mémoire Java
Verrous et état
Sujet Sécurité : Atomicité et visibilité...
Modèles d'interaction couramment utilisés en programmation multithread
Outils de programmation simultanée en Java5
Livre de référence
core java
La concurrence Java en pratique
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!