Thread
) qui va exécuter ce code.Thread
,Runnable
.run()
qui doit contenir le code à exécuter par le thread.Thread
implémente l'interface Runnable
qui définie la méthode run()
.public class MyThread extends Thread { @Override public void run() { System.out.println("Thread: " + Thread.currentThread().getName() + " (" + Thread.currentThread().threadId() + ")"); } }
public class MyRunnable implements Runnable { @Override public void run() { System.out.println("Runnable: " + Thread.currentThread().getName() + " (" + Thread.currentThread().threadId() + ")"); } }Il est recommandé d'implémenter l'interface
Runnable
, plutôt qu'étendre la classe Thread
,
car cela permet d'avoir une bonne séparation entre le thread (l'instance) et le code à exécuté par ce thread (voir section suivante).Thread
est réservée aux cas où on veut étendre ou modifier le comportement de la classe Thread
.Thread
(ou une sous classe de la classe Thread
).run()
).
À cette étape, seule l'instance de la classe Thread
est créée mais le thread d'exécution n'est pas encore démarré.Thread
.public class MyTest1 { Thread myThread = new MyThread(); }
Runnable
.public class MyTest1 { Runnable myRunnable = new MyRunnable(); Thread myThread = new Thread(myRunnable); }
Thread
ou implémenter l'interface Runnable
lors de l'instanciation du thread :
public class MyTest1 { Thread myThread = new Thread(new Runnable() { @Override public void run() { System.out.println("Anonymous Runnable: " + Thread.currentThread().getName() + " (" + Thread.currentThread().threadId() + ")"); } }); }
run()
de ce thread.start()
de l'instance du thread.
public class MyTest1 { public static void main(String[] args) { Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("Anonymous Runnable: " + Thread.currentThread().getName() + " (" + Thread.currentThread().threadId() + ")"); } }; Thread myThread = new Thread(myRunnable, "myFirstThread"); myThread.start(); } }Notes :
run()
dont l'appel va comme même provoquer l'exécution du code de cette méthode,
mais en aucun cas cet appel va lancer un nouveau thread d'exécution.public class MyTest1 { public static void main(String[] args) { Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("Anonymous Runnable: " + Thread.currentThread().getName() + " (" + Thread.currentThread().threadId() + ")"); } }; Thread myThread = new Thread(myRunnable, "myFirstThread"); myThread.start(); myThread.run(); } }Résultat d'exécution du code :
Anonymous Runnable: myFirstThread (9) Anonymous Runnable: main (1)Comme vous pouvez le remarquer l'appel de la méthode
run()
a été effectué dans le thread courant, dans notre cas le thread Main.start()
qui créé un nouveau thread d'exécution qui s'occupe d'appeler implicitement la méthode run()
.start()
peut démarrer un nouveau thread d'exécution.package com.mtitek.threads; public class MyTest1 { public static void main(String[] args) { Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("Anonymous Runnable: " + Thread.currentThread().getName() + " (" + Thread.currentThread().threadId() + ")"); } }; Thread myThread = new Thread(myRunnable, "myFirstThread"); myThread.start(); myThread.start(); } }Résultat d'exécution du code :
Anonymous Runnable: myFirstThread (9) Exception in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:638) at com.mtitek.threads.MyTest1.main(MyTest1.java:16)
start()
pour chacune de ces instances.public class MyTest1 { public static void main(String[] args) { Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("Anonymous Runnable: " + Thread.currentThread().getName() + " (" + Thread.currentThread().threadId() + ")"); } }; Thread myThread1 = new Thread(myRunnable, "myFirstThread"); Thread myThread2 = new Thread(myRunnable, "mySecondThread"); Thread myThread3 = new Thread(myRunnable, "myThirdThread"); myThread1.start(); myThread2.start(); myThread3.start(); } }Résultat d'exécution du code :
Anonymous Runnable: myFirstThread (9) Anonymous Runnable: mySecondThread (10) Anonymous Runnable: myThirdThread (11)
join()
).start()
a été appelée,run()
n'est pas en exécution par la JVM.run()
est en exécution par la JVM.run()
a terminée son exécution.public class ThreadStateTest { public static void main(String[] args) { Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("(1) " + Thread.currentThread().getState()); // RUNNABLE try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread myThread1 = new Thread(myRunnable, "myJoinThread"); System.out.println("(2) " + myThread1.getState()); // NEW myThread1.start(); System.out.println("(3) " + myThread1.getState()); // RUNNABLE try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("(4) " + myThread1.getState()); // TIMED_WAITING try { myThread1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("(5) " + myThread1.getState()); // TERMINATED } }Résultat d'exécution du code :
(2) NEW (3) RUNNABLE (1) RUNNABLE (4) TIMED_WAITING (5) TERMINATED