lang:java:thread
Ceci est une ancienne révision du document !
Table des matières
Différentes classes
Runnable
public class T implements Runnable { public void run() { } } public static void main(String[] args) { Thread t1 = new Thread(new T()); t1.start(); }
Thread
public class T extends Thread { public void run() { } } public static void main(String[] args) { T t1 = new T(); t1.start(); }
FutureTask
Une FutureTask
doit renvoyer un type. Mettre Void
et return null
si le type de retour n'est pas utilisé.
FutureTask
s'exécute depuis un Executor
et la valeur de retour est récupérée via la méthode bloquante get
.
Quand une exception est générée, elle est transformée en une ExecutionException
lors de l'appel à get
.
import java.util.concurrent.FutureTask; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ExecutionException; public class MyClass { public static void main(String args[]) { FutureTask<Void> futureTask = new FutureTask<Void> (() -> { throw new IOException("OUPS"); }); ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(futureTask); try { futureTask.get(); } catch (InterruptedException e) { } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("OK"); System.out.println("OK2"); executor.shutdown(); } }
OK OK2 java.util.concurrent.ExecutionException: java.io.IOException: OUPS at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) at MyClass.main(MyClass.java:15) Caused by: java.io.IOException: OUPS at MyClass.lambda$main$0(MyClass.java:10) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833)
Accès concurrent
class C { synchronized void p(){ } }
est équivalent à
class C { void p() { synchronized (this){ } } }
Le concept consiste à poser un lock sur une instance ou sur une classe.
Concurrency in JDK 5.0 Archive au 30/09/2019, version du 23/11/2004
Barrières
Semaphore
Barrière en attente d'un signal.
import java.util.concurrent.Semaphore; public class MyClass { public static void main(String args[]) { Semaphore semaphoreAcquisitionReady = new Semaphore(0); new Thread(() -> { try { Thread.sleep(50); } catch (InterruptedException e) {} System.out.println("BEFORE release"); semaphoreAcquisitionReady.release(); System.out.println("AFTER release"); }).start(); System.out.println("BEFORE acquire"); try { semaphoreAcquisitionReady.acquire(); } catch (InterruptedException e) {} System.out.println("AFTER acquire"); semaphoreAcquisitionReady.release(); } }
Sortie standard.
BEFORE acquire BEFORE release AFTER release AFTER acquire
lang/java/thread.1685536344.txt.gz · Dernière modification : 2023/05/31 14:32 de root