Cet article présente principalement des informations pertinentes sur les trois méthodes de construction du multi-threading Java. J'espère que tout le monde pourra maîtriser les connaissances de base très importantes.
Trois méthodes de construction du multi-threading Java
Hériter de la classe Thread pour créer une classe de thread
public class Thread extends Object implements Runnable
Définir une sous-classe de la classe Thread et remplacer sa méthode run()
Créer une instance de la sous-classe Thread, c'est-à-dire créer un objet thread
Appelez la méthode start() de l'objet thread pour démarrer le fil
public class FirstThread extends Thread { public void run(){ for(int i=0;i<100;i++){ /* * Thread类已经继承了Object * Object类创建了name选项 并且有其getName(),setName()方法 * 在继承Thread的类里面使用时只需要用this引用 */ System.out.println(this.getName()+" "+i); } } public static void main(String[] args) { for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); if(i==20){ new FirstThread().start(); new FirstThread().start(); } } } }
La classe Thread a été héritée d'Object
La classe Object crée l'option name et a ses méthodes getName(), setName()
Lorsqu'elle est utilisée dans un classe qui hérite de Thread, il vous suffit d'utiliser cette référence
Les deux threads secondaires ci-dessus et le thread principal sont commutés de manière aléatoire, et comme la classe qui hérite de Thread est utilisée, les deux threads secondaires ne peuvent pas partager de ressources
Une fois la méthode start() appelée, elle n'exécute pas immédiatement le code multithread, mais rend la programmation du thread exécutable. Le moment d'exécution est déterminé par le système d'exploitation
<.>
Implémentez l'interface Runnable pour créer une classe de thread
public Thread() public Thread(Runnable target) public Thread(Runnable target,String name)
public class SecondThread implements Runnable { public void run(){ for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); if(i==20){ SecondThread st=new SecondThread(); //通过new Thread(target,name)创建线程 new Thread(st,"新线程1").start(); new Thread(st,"新线程2").start(); } } } }Le résultat ci-dessus est que les deux threads secondaires et le thread principal changent de manière aléatoire, mais il n'y a pas de ressource partagée, car ils ne partagent pas du tout de ressources. Il n'y a aucune ressource disponible pour le partage.
Une fois la méthode start() appelée, elle n'exécute pas le code multithread immédiatement, mais rend la programmation du thread exécutable. Le moment d'exécution est déterminé par le système d'exploitation Hériter. la classe Thread et créez une explication détaillée des ressources partagées de l'interface Runnable
class Thread1 extends Thread{ private int count=5; private String name; public Thread1(String name) { this.name=name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 count= " + count--); try { sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); } }
B运行 count= 5 A运行 count= 5 B运行 count= 4 B运行 count= 3 B运行 count= 2 B运行 count= 1 A运行 count= 4 A运行 count= 3 A运行 count= 2 A运行 count= 1C'est précisément à cause de la phrase private int count=5 qu'il existe des ressources partagées, mais this C'est une sous-classe qui hérite de la classe Thread et ne peut pas partager de ressources
class Thread2 implements Runnable{ private int count=15; public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "运行 count= " + count--); try { Thread.sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { Thread2 my = new Thread2(); new Thread(my, "C").start();//同一个mt,但是在Thread中就不可以,如果用同一个实例化对象mt,就会出现异常 new Thread(my, "D").start(); new Thread(my, "E").start(); } }
C运行 count= 15 D运行 count= 14 E运行 count= 13 D运行 count= 12 D运行 count= 10 D运行 count= 9 D运行 count= 8 C运行 count= 11 E运行 count= 12 C运行 count= 7 E运行 count= 6 C运行 count= 5 E运行 count= 4 C运行 count= 3 E运行 count= 2La même chose est à cause de private Int count=15 est un objet d'instanciation courant. Seules les classes qui implémentent Runnable peuvent partager des ressourcesAlors pourquoi y a-t-il des différences dans le partage des ressources entre les sous-classes qui héritent de la classe Thread et implémentent l'interface Runable ?
Callable ressemble à une version améliorée de l'interface Runnable et possède une méthode call() équivalente à Runnable. La méthode run(), mais la fonction est plus puissante :
La méthode call() peut avoir une valeur de retour
La méthode call() peut déclarer lever une exception.
public class ThirdThread implements Callable<Integer> { public Integer call(){ int i=0; for(;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); } return i; } public static void main(String[] args){ ThirdThread tt=new ThirdThread(); FutureTask<Integer> task=new FutureTask<>(tt); Thread t=new Thread(task,"有返回值的线程"); for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); if(i==20){ t.start(); } } try{ System.out.println("返回值是:"+task.get()); }catch(Exception e){ e.printStackTrace(); } } }
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!