Heim  >  Artikel  >  Java  >  Teilen Sie drei Möglichkeiten zum Erstellen von Multithreading in Java

Teilen Sie drei Möglichkeiten zum Erstellen von Multithreading in Java

黄舟
黄舟Original
2017-09-18 09:37:351316Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zu den drei Konstruktionsmethoden von Java Multi-Threading vorgestellt. Ich hoffe, dass jeder, der dies benötigt, darauf zurückgreifen kann

Drei Konstruktionsmethoden für Java-Multithreading

Erben Sie die Thread-Klasse, um eine Thread-Klasse zu erstellen


public class Thread extends Object implements Runnable
    Definieren Sie eine Unterklasse der Thread-Klasse und überschreiben Sie deren run()-Methode
  1. Erstellen Sie eine Instanz der Thread-Unterklasse, dh erstellen Sie ein Thread-Objekt
  2. Rufen Sie die start()-Methode des Thread-Objekts auf, um den Thread zu starten


Die Thread-Klasse wurde von Object geerbt
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();
      }
    }
  }

}


Die Object-Klasse erstellt die Namensoption und verfügt über ihre getName()- und setName()-Methoden


Bei Verwendung in a Klasse, die Thread erbt, Sie müssen nur diese Referenz verwenden

Die beiden oben genannten sekundären Threads und der Hauptthread werden zufällig gewechselt, und da die Klasse verwendet wird, die Thread erbt, können die beiden sekundären Threads keine Ressourcen gemeinsam nutzen

Nachdem die Methode start() aufgerufen wurde, wird der Multithread-Code nicht sofort ausgeführt, sondern der Zustand der Thread-Programmierung wird durch das Betriebssystem bestimmt


Implementieren Sie die Runnable-Schnittstelle, um eine Thread-Klasse zu erstellen


public Thread() 
public Thread(Runnable target) 
public Thread(Runnable target,String name)
    Definieren Sie die Implementierungsklasse des Runnable-Schnittstelle und überschreiben Sie die run()-Methode der Schnittstelle
  • Erstellen Sie eine Instanz der Runnable-Implementierungsklasse und verwenden Sie sie als Ziel von Thread, um ein Thread-Objekt zu erstellen das eigentliche Thread-Objekt.


Das obige Ergebnis ist, dass die beiden sekundären Threads und der Hauptthread zufällig wechseln, es jedoch keine gemeinsam genutzte Ressource gibt. weil sie überhaupt keine Ressourcen teilen. Es sind keine Ressourcen zum Teilen verfügbar.
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();
      }
    }
  }
}

Nachdem die start()-Methode aufgerufen wurde, führt sie den Multithread-Code nicht sofort aus, sondern versetzt die Thread-Programmierung in den ausführbaren Zustand. Der Zeitpunkt der Ausführung wird vom Betriebssystem bestimmt.

Erben Erstellen Sie die Thread-Klasse und erstellen Sie eine detaillierte Erklärung der gemeinsam genutzten Ressourcen der Runnable-Schnittstelle
Wenn nur Ressourcen gemeinsam genutzt werden können, wird dasselbe Instanziierungsobjekt verwendet. Die beiden Erstellungsmethoden unterscheiden sich nur, wenn sie Ressourcen gemeinsam nutzen. Andernfalls werden gemeinsam genutzte Ressourcen normalerweise mit dem privaten statischen Modifikator geändert.


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(); 

  } 

}


Gerade wegen des Satzes private int count=5; gibt es gemeinsame Ressourcen, aber Dies ist eine Unterklasse, die die Thread-Klasse erbt und keine Ressourcen gemeinsam nutzen kann
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


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(); 
  } 

}


Das Gleiche gilt für private Int count=15 ist ein gemeinsames Instanziierungsobjekt. Nur Klassen, die Runnable implementieren, können Ressourcen gemeinsam nutzen.
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

Warum gibt es also Unterschiede bei der Ressourcenfreigabe zwischen Unterklassen, die die Thread-Klasse erben und die Runable-Schnittstelle implementieren?


Da Java nur die Einzelvererbung unterstützen kann, bedeutet die Einzelvererbungsfunktion, dass nur eine Unterklasse erben kann und der Runnabl-Schnittstelle viele Klassen folgen können, sodass mehrere Threads eine Ressource teilen können


Erstellen Sie einen Thread mit Callable und Future

Callable sieht aus wie eine erweiterte Version der Runnable-Schnittstelle und verfügt über eine call()-Methode, die Runnable entspricht Die run()-Methode, aber die Funktion ist leistungsfähiger:

Die call()-Methode kann einen Rückgabewert haben

Die call()-Methode kann deklarieren, dass sie eine Ausnahme auslöst


Für die Callable-Schnittstelle gelten generische Einschränkungen. Der generische Parametertyp in der Callable-Schnittstelle ist derselbe wie der Rückgabewerttyp der call()-Methode. Darüber hinaus ist die Callable-Schnittstelle eine funktionale Schnittstelle, sodass Sie Lambda-Ausdrücke verwenden können, um aufrufbare Objekte zu erstellen. Die Runnable-Schnittstelle ist ebenfalls eine funktionale Schnittstelle, sodass Sie auch Lambda-Ausdrücke verwenden können, um ausführbare Objekte zu erstellen


    Erstellen Sie eine Implementierungsklasse der Callable-Schnittstelle und implementieren Sie die call()-Methode. Die call()-Methode wird als Thread-Ausführungskörper verwendet und erstellen Sie dann eine Instanz der Callable-Implementierungsklasse
  1. Verwenden Sie die FutureTask-Klasse, um das Callable-Objekt einzuschließen. Das FutureTask-Objekt kapselt die call()-Methode des Callable-Objekts
  2. Verwenden Sie die FutureTask-Klasse Objekt als Ziel des Thread-Objekts zum Erstellen und Starten eines neuen Threads
  3. Rufen Sie die get()-Methode des FutureTask-Objekts auf, um den Rückgabewert nach dem Ende des untergeordneten Threads zu erhalten


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();
    }
  }
}
Threads, die mit Callable- und Future of Lambda-Ausdrücken erstellt wurden


Das obige ist der detaillierte Inhalt vonTeilen Sie drei Möglichkeiten zum Erstellen von Multithreading in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn