Thread est un chemin d'exécution à l'intérieur d'un programme. La méthode principale que nous connaissons est en fait un chemin d'exécution distinct. S'il n'y a qu'un seul chemin d'exécution dans le programme, alors Ce programme est un programme monothread ; puisqu'il existe un seul thread, il y aura également du multi-threading. Le sens littéral peut être compris comme « une technologie qui utilise plusieurs processus d'exécution sur des logiciels et du matériel par rapport à un seul. thread". Les avantages du multi-threading sont #🎜🎜 #Améliorer l'utilisation du processeur. Dans un programme multithread, lorsqu'un thread doit attendre, le processeur peut exécuter d'autres threads au lieu d'attendre, améliorant ainsi considérablement l'efficacité du programme.
Création de multi-threadsMéthode 1 : Hériter de la classe ThreadProcessus de création de la méthode 1 : #🎜 🎜 ##🎜🎜 #3. Remettez l'objet de tâche MyRunnable à Thread pour traitement ; Appelez la méthode start() de l'objet thread pour démarrer le thread ;
# 🎜🎜#public Thread (Runnable target, String name)#🎜 🎜#
Encapsulez l'objet Runnable en tant qu'objet thread et spécifiez le nom du threadpublic class ThreadDemo01 { public static void main(String[] args) { MyThread myThread1 = new MyThread(); myThread1.start(); for (int i = 0; i < 3; i++) { System.out.println("主线程正在执行~~"); } } } class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println("子线程正在执行~~"); } } } //输出结果(不唯一): //主线程正在执行~~ //主线程正在执行~~ //主线程正在执行~~ //子线程正在执行~~ //子线程正在执行~~ //子线程正在执行~~#🎜 🎜#La différence entre ce code et la méthode 1 est que l'objet de tâche MyRunnable doit être encapsulé dans Thread. Les autres emplacements sont fondamentalement inchangés.
Avantages : la classe de tâches de thread implémente uniquement l'interface, et peut continuer à hériter de la classe et à implémenter l'interface, et a une forte évolutivité ; | Inconvénients : La programmation nécessite une couche supplémentaire d'empaquetage d'objets. Si le thread a des résultats d'exécution, il ne peut pas être renvoyé directement. |
1 Créez un objet de classe interne anonyme Runnable #🎜. 🎜# | 2. Laissez-le à Thread pour le traitement ;3. Appelez start() de l'objet thread pour démarrer le thread ; tandis que l'autre est multithread via des classes internes anonymes. Et ce bloc de code peut également être rationalisé grâce à des expressions lambda. Je me demande si vous êtes toujours impressionné par ce point de connaissance ? Si vous oubliez, vous pouvez lire cet article : Comment comprendre les expressions lambda en Java - simplification |
Après avoir appris les deux créations précédentes Après le Avec une approche multithread, nous constaterons qu'il y a un problème : 1. La méthode run() réécrite ne peut pas renvoyer directement les résultats ; 2. Elle ne convient pas aux scénarios métier qui doivent renvoyer les résultats de l'exécution du thread ; Nous avons donc besoin d’une troisième voie pour résoudre ces problèmes. | Processus de création de la méthode trois : |
2. Utilisez FutureTask pour encapsuler l'objet Callable dans un objet de tâche de thread | 3. Remettez l'objet de tâche de thread à Thread pour traitement ; 4. Appelez la méthode start() de Thread pour démarrer Thread, exécutez la tâche ; |
# 🎜 🎜#Récupérer le résultat renvoyé par le thread exécutant la méthode d'appel
public class ThreadDemo03 { public static void main(String[] args) throws Exception { MyCallable myCallable = new MyCallable(); FutureTask<String> futureTask = new FutureTask<>(myCallable); Thread thread = new Thread(futureTask); thread.start(); int sum= 0; for (int i = 0; i < 3; i++) { sum+=i; } System.out.println(sum); String s =futureTask.get(); System.out.println(s); } } class MyCallable implements Callable<String > { @Override public String call(){ int sum=0; for (int i = 0; i < 3; i++) { sum+=i; } return "子线程计算结果:"+sum; } } //输出结果: //3 //子线程计算结果:3
方式三优缺点:
优点:
线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;
可以在线程执行完毕后去获取 线程执行的结果;
缺点:
编码复杂一点;
方式 | 优点 | 缺点 |
继承Thread类 | 编程比较简单,可以直接使用Thread类中的方法 | 扩展性较差,不能再继承其他的类,不能返回线程执行的结果 |
实现Runnable接口 | 扩展性强,实现该接口的同时还可以继承其他的类 | 编程相对复杂,不能返回线程执行的结果 |
实现Callable接口 | 扩展性强,实现该接口的同时还可以继承其他的类,可以得到线程的执行结果 | 编程相对复杂 |
方法名称 | 说明 |
String getName() | 获取当前线程的名称,默认线程名称是Thread-索引 |
void setName(String name) | 将此线程更改为指定的名称,通过构造器也可以设置线程名称 |
简单地通过一段代码让大家能够清晰地了解这个代码该如何使用:
public class ThreadDemo04 { public static void main(String[] args) throws Exception { thread thread1 = new thread(); thread1.setName("1号子线程"); thread1.start(); thread thread2 = new thread(); thread2.setName("2号子线程"); thread2.start(); } } class thread extends Thread { @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println(this.getName()+"正在执行任务"+i); } } } //输出结果: //2号子线程正在执行任务0 //1号子线程正在执行任务0 //2号子线程正在执行任务1 //1号子线程正在执行任务1 //2号子线程正在执行任务2 //1号子线程正在执行任务2
方法名称 | 说明 |
public static void sleep(long time) | 让当前线程休眠指定的时间后再继续执行,单位为毫秒 |
public class ThreadDemo05 { public static void main(String[] args) throws Exception { for (int i = 0; i < 5; i++) { System.out.println(i); if (i==3){ Thread.sleep(5000); } } } } //输出结果: //1 //2 //3 //在输出过3以后,等待5秒之后再进行输出 //4
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!