Maison >Java >javaDidacticiel >Java est-il multithread ?
Java est multi-thread. Il existe trois façons d'utiliser le multi-threading : hériter de la classe Thread, implémenter l'interface Runnable et utiliser Callable et Future pour créer des threads.
Hériter de la classe Thread (Apprentissage recommandé : cours java )
Implémentation La méthode est très simple. Il vous suffit de créer une classe pour hériter de la classe Thread, puis de réécrire la méthode run, dans la méthode main, d'appeler la méthode start de l'objet instance de classe pour obtenir une concurrence multithread. Code :
public class MyThread extends Thread { @Override public void run(){ super.run(); System.out.println("执行子线程..."); } }
Cas de test :
public class Test { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); System.out.println("主线程..."); } }
Résultat de l'exécution :
Implémenter l'interface Runnable
L'implémentation de cette méthode est également très simple, qui consiste à modifier la classe Thread héritée pour implémenter l'interface Runnable. Le code est le suivant :
public class MyRunnable implements Runnable { @Override public void run() { System.out.println("执行子线程..."); } }
Cas de test :
public class Test { public static void main(String[] args) { Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); System.out.println("主线程运行结束!"); } }
Résultat d'exécution :
Utilisez Callable et Future pour créer des threads
Les deux méthodes ci-dessus ont ces deux problèmes :
Impossible d'obtenir la valeur de retour du fil enfant
La méthode run ne peut pas lever d'exceptions
Afin de résoudre ces deux problèmes, nous devons utiliser l'interface Callable. En parlant d'interfaces, l'instance de classe d'implémentation d'interface Runnable ci-dessus est transmise en tant que paramètre du constructeur de la classe Thread, puis le contenu de la méthode run est exécuté via le démarrage de Thread. Cependant, Callable n'est pas une sous-interface de Runnable, mais une toute nouvelle interface. Ses instances ne peuvent pas être directement transmises à la construction Thread, une autre interface est donc nécessaire pour la convertir.
Dans ce cas, il y a en fait un processus de conversion de plus que la méthode précédente. Au final, un nouveau fil de discussion est créé via le démarrage du fil. Avec cette idée, le code est facile à comprendre :
import java.util.concurrent.Callable; public class MyCallable implements Callable { int i = 0; @Override public Object call() throws Exception { System.out.println(Thread.currentThread().getName()+" i的值:"+ i); return i++; //call方法可以有返回值 } }
Test :
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class Test { public static void main(String[] args) { Callable callable = new MyCallable(); for (int i = 0; i < 10; i++) { FutureTask task = new FutureTask(callable); new Thread(task,"子线程"+ i).start(); try { //获取子线程的返回值 System.out.println("子线程返回值:"+task.get() + "\n"); } catch (Exception e) { e.printStackTrace(); } } } }
Résultat de l'exécution (partie) :
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!