Maison  >  Article  >  Java  >  Partagez trois façons de créer du multithreading en Java

Partagez trois façons de créer du multithreading en Java

黄舟
黄舟original
2017-09-18 09:37:351322parcourir

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
  1. Définir une sous-classe de la classe Thread et remplacer sa méthode run()

  2. Créer une instance de la sous-classe Thread, c'est-à-dire créer un objet thread

  3. 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)
  • Définissez la classe d'implémentation du Interface Runnable et remplacez la méthode run() de l'interface

  • Créez une instance de la classe d'implémentation Runnable et utilisez-la comme cible de Thread pour créer un objet Thread. le véritable objet thread.



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

Lorsqu'il n'y a que des ressources pouvant être partagées, le même objet d'instanciation est utilisé. Les deux méthodes de création ne différeront que lorsqu'elles partageront des ressources, sinon elles ne partageront pas de ressources. Les ressources partagées sont généralement modifiées avec le modificateur private static.


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= 1
C'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= 2
La 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 ressources

Alors 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 ?


Étant donné que Java ne peut prendre en charge qu'un seul héritage, la fonctionnalité d'héritage unique signifie qu'une seule sous-classe peut hériter et que l'interface Runnabl peut être suivie par plusieurs classes, afin que plusieurs threads puissent partager une ressource. 🎜>


Créez un fil de discussion à l'aide de Callable et Future

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


L'interface Callable a des restrictions génériques, le type de paramètre générique dans l'interface Callable est le même que le type de valeur de retour de la méthode call(). De plus, l'interface Callable est une interface fonctionnelle, vous pouvez donc utiliser des expressions Lambda pour créer des objets Callable. L'interface Runnable est également une interface fonctionnelle, vous pouvez donc également utiliser des expressions Lambda pour créer des objets Runnable

.

    Créez une classe d'implémentation de l'interface Callable et implémentez la méthode call(). La méthode call() sera utilisée comme corps d'exécution du thread, puis créez une instance de la classe d'implémentation Callable <.>
  1. Utilisez la classe FutureTask pour envelopper l'objet Callable, l'objet FutureTask encapsule la méthode call() de l'objet Callable
  2. Utilisez la classe FutureTask comme cible de l'objet Thread pour créer et démarrer un nouveau thread
  3. Appelez la méthode get() de l'objet FutureTask pour obtenir la valeur de retour après la fin du thread enfant


Threads créés à l'aide des expressions Callable et Future of Lambda
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn