Explication détaillée du multithreading Java
Introduction aux connaissances de base sur le multi-thread
L'utilisation du multi-threading peut simplifier le modèle et écrire du code puissant, mais il n'est pas facile d'écrire correctement le multi-threading et nécessite un processus de pratique à long terme.
Introduction aux concepts de base du multi-threading
Processus et threads
① Processus : le processus d'exécution d'un programme (tâche). Dynamique
Contient les ressources (mémoire partagée, fichiers partagés) et les threads. Carrier
Exemples : Eclipse, QQ
② Sujet :
Eclipse : édition de texte du code source, compilation du code source, vérification de la syntaxe.
QQ : discuter par SMS, envoyer et recevoir des fichiers.
Si le processus est comparé à une classe, alors chaque élève de cette classe est un fil conducteur. Les élèves constituent la plus petite unité de la classe et constituent la plus petite unité de la classe. Une classe peut avoir plusieurs élèves, et ces élèves utilisent tous les mêmes tables, chaises, tableaux noirs et craies dans la classe.
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.
Interaction des fils de discussion
Exclusion mutuelle et synchronisation.
Première expérience avec les threads Java
Java.lang
class Thread
interface Runnable
public void run ()
Méthodes courantes des threads
Catégorie
|
Signature de méthode |
Introduction |
|||||||||||||||||||||||||||
Création de fils de discussion |
Thread() | ||||||||||||||||||||||||||||
Thread (Nom de la chaîne) | |||||||||||||||||||||||||||||
Thread (Cible exécutable) | |||||||||||||||||||||||||||||
Thread (cible exécutable, nom de chaîne) | |||||||||||||||||||||||||||||
Méthode de thread |
void start() | Démarrer le fil |
|||||||||||||||||||||||||||
veille statique (long millis) | |||||||||||||||||||||||||||||
veille vide statique (long millis,int nanos) | |||||||||||||||||||||||||||||
void join( ) | Faire attendre les autres threads que le thread en cours se termine | tr>||||||||||||||||||||||||||||
void join (long millis) | |||||||||||||||||||||||||||||
void join(long millis,int nanos) | |||||||||||||||||||||||||||||
rendement vide statique() | Le thread en cours d'exécution libère des ressources de processeur |
||||||||||||||||||||||||||||
Obtenir la référence du fil |
Static Thread currentThread() |
Lorsque les deux threads n'effectuent aucun traitement, ils s'exécuteront alternativement.
Lorsque vous utilisez le type booléen pour contrôler la boucle d'un thread, ajoutez le mot-clé volatile avant la variable Volatile garantit que le thread peut lire correctement les valeurs écrites par d'autres threads.
Remarque :
La fonction de la méthode sleep() : met le thread en veille pendant la durée spécifiée.
La fonction de la méthode join() : // Faire en sorte que les autres threads attendent que le thread actuel termine son exécution.
Cas multi-thread
Exemple 1 :
1 package com.czgo; 2 3 4 5 /** 6 7 * 线程先生 8 9 * @author 疯子 10 11 * 12 13 */ 14 15 public class Actor extends Thread { 16 17 @Override 18 19 public void run() { 20 21 //getName():获取当前线程的名称 22 23 System.out.println(getName()+"是一个演员!"); 24 25 //用来记录线程跑的次数 26 27 int count = 0; 28 29 boolean keepRunning = true; 30 31 while(keepRunning){ 32 33 System.out.println(getName()+"登台演出"+(++count)); 34 35 if(count==100){ 36 37 keepRunning = false; 38 39 } 40 41 if(count%10==0){ 42 43 try { 44 45 Thread.sleep(1000); 46 47 } catch (InterruptedException e) { 48 49 e.printStackTrace(); 50 51 } 52 53 } 54 55 } 56 57 System.out.println(getName()+"的演出结束了!"); 58 59 } 60 61 62 63 public static void main(String[] args) { 64 65 Thread actor = new Actor(); 66 67 //setName:设置线程的名称 68 69 actor.setName("Mr.Thread"); 70 71 //启动线程 72 73 actor.start(); 74 75 76 77 Thread actressThread = new Thread(new Actress(),"Ms.Runnable"); 78 79 actressThread.start(); 80 81 } 82 83 } 84 85 86 87 class Actress implements Runnable{ 88 89 @Override 90 91 public void run() { 92 93 //getName():获取当前线程的名称 94 95 //currentThread()获取当前线程的引用 96 97 System.out.println(Thread.currentThread().getName()+"是一个演员!"); 98 99 //用来记录线程跑的次数 100 101 int count = 0; 102 103 boolean keepRunning = true; 104 105 while(keepRunning){ 106 107 System.out.println(Thread.currentThread().getName()+"登台演出"+(++count)); 108 109 if(count==100){ 110 111 keepRunning = false; 112 113 } 114 115 if(count%10==0){ 116 117 try { 118 119 Thread.sleep(1000); 120 121 } catch (InterruptedException e) { 122 123 e.printStackTrace(); 124 125 } 126 127 } 128 129 } 130 131 System.out.println(Thread.currentThread().getName()+"的演出结束了!"); 132 133 }134 135 }
Exemple 2 :
Armée :
1 package com.czgo; 2 3 4 5 /** 6 7 * 军队线程 8 9 * 模拟作战双方的行为 10 11 * @author 疯子 12 13 * 14 15 */ 16 17 public class ArmyRunnable implements Runnable { 18 19 20 21 //volatile保证了线程可以正确的读取其他线程写入的值 22 23 //可见性 ref JMM,happens-before 24 25 volatile boolean keepRunning = true; 26 27 28 29 @Override 30 31 public void run() { 32 33 34 35 while(keepRunning){ 36 37 //发动5连击 38 39 for(int i=0;i<5;i++){ 40 41 System.out.println(Thread.currentThread().getName()+"进攻对方["+i+"]"); 42 43 //让出了处理器时间,下次谁进攻还不一定呢! 44 45 Thread.yield(); 46 47 } 48 49 } 50 51 52 53 System.out.println(Thread.currentThread().getName()+"结束了战斗!"); 54 55 56 57 } 58 59 }
Chiffres clés :
1 package com.czgo; 2 3 4 5 /** 6 7 * 关键人物 8 9 * @author 疯子 10 11 * 12 13 */ 14 15 public class KeyPersonThread extends Thread { 16 17 @Override 18 19 public void run() { 20 21 System.out.println(Thread.currentThread().getName()+"开始了战斗!"); 22 23 for(int i=0;i<10;i++){ 24 25 System.out.println(Thread.currentThread().getName()+"左突右杀,攻击随军..."); 26 27 } 28 29 System.out.println(Thread.currentThread().getName()+"结束了战斗!"); 30 31 32 33 } 34 35 }
Étape :
1 package com.czgo; 2 3 4 5 /** 6 7 * 隋唐演义大戏舞台 8 9 * @author win7 10 11 * 12 13 */ 14 15 public class Stage extends Thread { 16 17 18 19 @Override 20 21 public void run() { 22 23 System.out.println("欢迎观看隋唐演义"); 24 25 26 27 try { 28 29 Thread.sleep(5000); 30 31 } catch (InterruptedException e2) { 32 33 e2.printStackTrace(); 34 35 } 36 37 38 39 System.out.println("大幕徐徐拉开"); 40 41 42 43 try { 44 45 Thread.sleep(5000); 46 47 } catch (InterruptedException e2) { 48 49 e2.printStackTrace(); 50 51 } 52 53 54 55 System.out.println("话说隋朝末年,隋军与农民起义军杀得昏天暗地..."); 56 57 58 59 //隋朝军队 60 61 ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable(); 62 63 //农民起义军 64 65 ArmyRunnable armyTaskOfRevolt = new ArmyRunnable(); 66 67 68 69 //使用Runnable接口创建线程 70 71 Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty,"隋军"); 72 73 Thread armyOfSuiRevolt = new Thread(armyTaskOfRevolt,"农民起义军"); 74 75 76 77 //启动线程,让军队开始作战 78 79 armyOfSuiDynasty.start(); 80 81 armyOfSuiRevolt.start(); 82 83 84 85 //舞台线程休眠,大家专心观看军队的厮杀 86 87 try { 88 89 //Thread会指向当前类的线程 90 91 Thread.sleep(50); 92 93 } catch (InterruptedException e) { 94 95 e.printStackTrace(); 96 97 } 98 99 System.out.println("正当双方激战正酣,半路杀出了个程咬金"); 100 101 102 103 Thread mrCheng = new KeyPersonThread(); 104 105 mrCheng.setName("程咬金"); 106 107 108 109 System.out.println("程咬金的理想就是结束战争,使百姓安居乐业!"); 110 111 112 113 //停止军队作战 114 115 //停止线程的方法 116 117 armyTaskOfSuiDynasty.keepRunning=false; 118 119 armyTaskOfRevolt.keepRunning=false; 120 121 122 123 try { 124 125 Thread.sleep(2000); 126 127 } catch (InterruptedException e1) { 128 129 e1.printStackTrace(); 130 131 } 132 133 134 135 //历史大戏留给关键人物 136 137 mrCheng.start(); 138 139 140 141 try { 142 143 //使其他线程等待当前线程执行完毕 144 145 mrCheng.join(); 146 147 } catch (InterruptedException e) { 148 149 e.printStackTrace();150 151 } 152 153 154 155 System.out.println("战争结束,人民安居乐业,程先生实现了积极的人生梦想,为人民作出了贡献!"); 156 157 System.out.println("谢谢观看隋唐演义,再见!"); 158 159 } 160 161 162 163 public static void main(String[] args) { 164 165 new Stage().start(); 166 167 } 168 169 }
Arrêt correct des threads
Comment arrêter correctement les threads en Java :
Vous pouvez contrôler la sortie de la boucle via le type booléen.
méthode not stop
la méthode stop() arrêtera le thread brusquement.
La méthode stop() n'est pas la bonne façon d'arrêter un thread.
Interaction des threads
Condition de concurrence
Lorsque plusieurs threads partagent l'accès aux mêmes données (zone mémoire) au niveau en même temps), chaque thread tente d'opérer sur les données, provoquant la corruption des données. Ce phénomène est appelé une condition de concurrence critique.
Qu’est-ce que l’exclusion mutuelle ?
Comment parvient-on à l’exclusion mutuelle ?
n'est accessible que par un seul fil de discussion, mutuellement exclusif.
Mise en œuvre de l'exclusion mutuelle : verrouillage synchronisé (verrouillage intrinsèque).
Implémentation de la synchronisation : wait()/notify()/notifyAll().
Comment élargir vos connaissances sur la concurrence Java
Mode mémoire Java
JMM décrit comment les threads Java interagissent via la mémoire
Se produit -avant
Synchronisé, volatile&final
Locks&Condition
Implémentation de haut niveau du mécanisme de verrouillage Java et des conditions d'attente
Java.util.concurrent.locks
Sécurité des threads
Atomicité et visibilité
Java.util.concurrent.atomic
Synchronisé et volatile
DeadLocks
Plus modèle interactif couramment utilisé dans la programmation de threads
Modèle producteur-consommateur
Modèle de verrouillage en lecture-écriture
Modèle futur
Modèle de thread de travail
Outils de programmation simultanée en Java5
Deux livres sont recommandés :
Core Java
La concurrence Java en pratique
Comparaison de deux manières de thread créationThread :
① Hériter de la classe Thread
Runnable : ① La méthode Runnable peut éviter les défauts de 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), ce qui convient aux situations où plusieurs threads traitent la même ressource.
Cas :
Thread :
Exécutable :Cycle de vie du thread1 package com.czgo; 2 3 4 5 class MyThread extends Thread{ 6 7 8 9 private int ticketsCont = 5; //一共有5张火车票 10 11 12 13 private String name; //窗口,也即是线程的名字 14 15 16 17 public MyThread(String name){ 18 19 this.name = name; 20 21 } 22 23 24 25 @Override 26 27 public void run() { 28 29 30 31 while(ticketsCont>0){ 32 33 ticketsCont--; //如果还有票,就卖掉一张 34 35 System.out.println(name+"卖了1张票,剩余票数为:"+ticketsCont); 36 37 } 38 39 } 40 41 42 43 } 44 45 46 47 public class TicketsThread { 48 49 50 51 public static void main(String[] args) { 52 53 //创建3个线程,模拟三个窗口卖票 54 55 MyThread mt1 = new MyThread("窗口1"); 56 57 MyThread mt2 = new MyThread("窗口2"); 58 59 MyThread mt3 = new MyThread("窗口3"); 60 61 62 63 //启动这三个线程,也即是窗口,开始卖票 64 65 mt1.start(); 66 67 mt2.start(); 68 69 mt3.start(); 70 71 72 73 } 74 75 76 77 }
1 package com.czgo; 2 3 4 5 class MyThread implements Runnable{ 6 7 8 9 private int ticketsCont = 5; //一共有5张火车票 10 11 12 13 @Override 14 15 public void run() { 16 17 18 19 while(ticketsCont>0){ 20 21 ticketsCont--; //如果还有票,就卖掉一张 22 23 System.out.println(Thread.currentThread().getName()+"卖了1张票,剩余票数为:"+ticketsCont); 24 25 } 26 27 28 29 } 30 31 32 33 } 34 35 36 37 public class TicketsRunnable { 38 39 40 41 public static void main(String[] args) { 42 43 44 45 MyThread mt1 = new MyThread(); 46 47 MyThread mt2 = new MyThread(); 48 49 MyThread mt3 = new MyThread(); 50 51 52 53 //创建三个线程来模拟三个售票窗口 54 55 Thread th1 = new Thread(mt1,"窗口1"); 56 57 Thread th2 = new Thread(mt2,"窗口2"); 58 59 Thread th3 = new Thread(mt3,"窗口3"); 60 61 62 63 //启动这三个线程,也即是三个窗口开始卖票 64 65 th1.start(); 66 67 th2.start(); 68 69 th3.start(); 70 71 72 73 } 74 75 76 77 }
Création : Créez un nouvel objet thread, tel que Thread thd = new Thread().
Prêt : après avoir créé l'objet thread, la méthode start() du thread est appelée (remarque : à ce stade, le thread entre simplement dans la file d'attente des threads, en attendant d'obtenir le service CPU, et a les conditions pour s'exécuter, 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(), 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, par exemple en appelant la méthode sleep().
Le saint patron des threads - thread démon Il existe deux types de threads Java :
User Thread : s'exécute au premier plan et effectue des tâches spécifiques. Par exemple, le thread principal du programme, les sous-threads connectés au réseau, etc. sont tous des threads utilisateur.
Thread démon : s'exécute en arrière-plan et sert d'autres threads de premier plan.
Caractéristiques : Une fois que tous les threads utilisateur ont fini de s'exécuter, le thread démon terminera son travail avec la JVM.
Application : 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 : le thread de récupération de place.
如何设置守护线程
可以通过调用Thread类的setDaemon(true)方法来设置当前线程为守护线程。
注意事项:
setDaemon(true)必须在start()方法之前调用,否则会抛出IllegalThreadStateException异常。
在守护线程中产生的新线程也是守护线程
不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑。
案例:
1 package com.czgo; 2 3 4 5 import java.io.File; 6 7 import java.io.FileOutputStream; 8 9 import java.io.IOException; 10 11 import java.io.OutputStream; 12 13 import java.util.Scanner; 14 15 16 17 class DaemonThread implements Runnable{ 18 19 @Override 20 21 public void run() { 22 23 System.out.println("进入守护线程"+Thread.currentThread().getName()); 24 25 try { 26 27 writeToFile(); 28 29 } catch (IOException e) { 30 31 e.printStackTrace(); 32 33 } catch (InterruptedException e) { 34 35 e.printStackTrace(); 36 37 } 38 39 System.out.println("退出守护线程"+Thread.currentThread().getName()); 40 41 42 43 } 44 45 46 47 private void writeToFile() throws IOException, InterruptedException{ 48 49 File filename = new File("C:\\ide"+File.separator+"daemon.txt"); 50 51 OutputStream os = new FileOutputStream(filename,true); 52 53 int count = 0; 54 55 while(count<999){ 56 57 os.write(("\r\nword"+count).getBytes()); 58 59 System.out.println("守护线程"+Thread.currentThread().getName()+"向文件中写入了word"+count++); 60 61 Thread.sleep(1000); 62 63 } 64 65 os.close(); 66 67 } 68 69 } 70 71 72 73 public class DaemonThreadDemo { 74 75 76 77 public static void main(String[] args) { 78 79 80 81 System.out.println("进入主线程"+Thread.currentThread().getName()); 82 83 DaemonThread daemonThread = new DaemonThread(); 84 85 Thread thread = new Thread(daemonThread); 86 87 thread.setDaemon(true); 88 89 thread.start(); 90 91 92 93 Scanner sc = new Scanner(System.in); 94 95 sc.next(); 96 97 98 99 System.out.println("退出主线程"+Thread.currentThread().getName()); 100 101 } 102 103 104 105 }
使用jstack生成线程快照
jstack
作用:生成jvm当前时刻线程的快照(threaddump,即当前进程中所有线程的信息)
目的:帮助定位程序问题出现的原因,如长时间停顿、cpu占用率过高等。
如何使用jstack
jstack –l pid
内存可见性
可见性介绍
可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到。
共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。
Java内存模型(JMM)
Java内存模型(Java Memory Model)描述了程序中各种变量(线程共享变量)的访问规则,以及在Java中将变量存储到内存和从内存中读取出变量这样的底层细节。
所有变量都存储在主内存中
每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一份拷贝)。
线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写。
不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来完成。
共享变量可见性实现的原理
线程1对共享变量的修改要想被线程2及时看到,必须要经过如下2个步骤:
把工作内存1中更新过的共享变量刷新到主内存中。
将主内存中最新的共享变量的值更新到工作内存2中。
可见性
要实现共享变量的可见性,必须保证两点:
线程修改后的共享变量值能够及时从工作内存刷新到主内存中。
其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存中。
可见性的实现方式
Java语言层面支持的可见性实现方式:
Synchronized
Volatile
Synchronized实现可见性
Synchronized能够实现:
原子性(同步);
可见性
JMM关于Synchronized的两条规定:
线程解锁前,必须把共享变量的最新值刷新到主内存中;
线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意:加锁与解锁需要是同一把锁)
线程解锁前对共享变量得修改在下次加锁时对其他线程可见。
线程执行互斥代码的过程:
获得互斥锁
清空工作内存
从主内存中拷贝变量的最新副本到工作内存
执行代码。
将更改后的共享变量的值刷新到主内存。
释放互斥锁。
重排序
重排序:代码书写的顺序与实际执行的顺序不同,指令重排序是编译器或处理器为了提高程序性能而做的优化。
编译器优化的重排序(编译器优化)。
指令级并行重排序(处理器优化)。
内存系统的重排序(处理器优化)。
as-if-serial
as-if-serial:无论如何重排序,程序执行的结果应该与代码顺序执行的结果一致(java编译器、运行时和处理器都会保证Java在单线程下遵循as-if-serial语义)。
例子:
Int num = 1;
Int num2 = 2;
Int sum = num+num2;
单线程:第1、2行的顺序可以重排,但第3行不能
重排序不会给单线程带来内存可见性问题
多线程中程序交错执行时,重排序可能会造成内存可见性问题。
Volatile实现可见性
Volatile关键字:
能够保证volatile变量的可见性
不能保证volatile变量复合操作的原子性
Volatile如何实现内存可见性:
En profondeur : cela est obtenu en ajoutant des barrières de mémoire et en désactivant l'optimisation de la réorganisation.
Lorsqu'une opération d'écriture est effectuée sur une variable volatile, une instruction de barrière de stockage sera ajoutée après l'opération d'écriture
Lorsqu'une opération de lecture est effectuée sur une variable volatile, une instruction de barrière de chargement sera être ajouté avant l'opération de lecture
En termes simples : chaque fois qu'un thread accède à une variable volatile, la valeur de la variable est forcée d'être relue depuis la mémoire principale, et lorsque la variable change, le thread est obligé d'actualiser la dernière valeur dans la mémoire principale. De cette façon, différents threads peuvent toujours voir la dernière valeur de la variable à tout moment.
Le processus d'écriture des variables volatiles par le thread :
Modifier la valeur de la copie de la variable volatile dans la mémoire de travail du thread
sera modifié La valeur de la copie est vidée de la mémoire de travail vers la mémoire principale
Le processus de lecture des variables volatiles par le thread :
Lecture des variables volatiles depuis la mémoire principale La dernière valeur dans la mémoire de travail du thread
Lire une copie de la variable volatile depuis la mémoire de travail.
Occasions volatiles applicables
Pour utiliser des variables volatiles en toute sécurité dans des multi-threads, vous devez répondre aux exigences suivantes en même temps :
1. L'opération d'écriture dans une variable ne dépend pas de sa valeur actuelle
2. Booléen, utilisé pour enregistrer la température
3. Cette variable n'est pas incluse dans un invariant avec d'autres variables.
Remarques finales : Ne vous souciez pas de ce que les autres pensent de vous dans votre dos, car ces mots ne peuvent pas changer les faits, mais ils peuvent gâcher votre cœur.
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.
