Heim > Java > javaLernprogramm > Hauptteil

Multithreading-Implementierung und Thread-Sicherheit in der Java-Entwicklung

无忌哥哥
Freigeben: 2018-07-23 09:36:30
Original
1856 Leute haben es durchsucht

So implementieren Sie Multithreading

● Erben Sie die Thread-Klasse, um eine Thread-Klasse zu erstellen und die Ausführungsmethode zu überschreiben. Die Ausführungsmethode stellt die Aufgaben dar, die ausgeführt werden Der Thread muss abgeschlossen werden. Rufen Sie Start() des Thread-Objekts auf, um den Thread zu starten. Die Thread-Klasse hat die Thread-Klasse geerbt und kann daher keine anderen übergeordneten Klassen erben.

class ThreadTest extends Thread {  

    Thread thread;  

    public ThreadTest(Thread thread) {  
      this.thread = thread;  
  }  

   @Override  
   public void run() {  
      synchronized (thread) {  
          System.out.println("getObjectLock");  
         try {  
             Thread.sleep(9000);  
       } catch (InterruptedException ex) {  
          ex.printStackTrace();  
         }  
           System.out.println("ReleaseObjectLock");  
    }  
   }  
 }
Nach dem Login kopieren
Nach dem Login kopieren

● Implementieren Sie die Runnable-Schnittstelle, um eine Thread-Klasse zu erstellen, definieren Sie die Runnable-Implementierungsklasse und überschreiben Sie die Ausführungsmethode.

  class RunnableImpl implements Runnable {  
    
     public void run() {  
          try {  
             System.out.println("Begin sleep");  
             Thread.sleep(2000);  
             System.out.println("End sleep");  
          } catch (InterruptedException e) {  
              e.printStackTrace();  
          }  
      }  
   }
Nach dem Login kopieren

● Implementieren Sie die Callable-Schnittstelle, schreiben Sie die call()-Methode neu und call() dient als Ausführung des Thread-Körpers mit Rückgabewert

● Thread-Pool, verwenden Sie den Thread-Pool, um Thread-Objekte zu generieren java.util.concurrent.ExecutorService, java.util.concurrent.Executors;

Wie Java die Thread-Sicherheit implementiert

● Sich gegenseitig ausschließende Synchronisierung: Es wird empfohlen, das synchronisierte Schlüsselwort für die Synchronisierung zu verwenden. Es gibt die ReentrantLock-Klasse und der Implementierungseffekt ist ähnlich original synchronisiert wird weiterhin empfohlen
● Blockierungsfreie Synchronisierung: Zur Ausführung sind Hardwareanweisungen erforderlich. Häufig verwendete Anweisungen sind: Test-and-Set Fetch-and-Increment Swap Compare-and-Swap (CAS) Load-Linked/Store-Conditional (LL/SC) Typische Anwendungen : AtomicInteger in
● Keine Synchronisationslösung: Speichern Sie Variablen in lokalen Threads, damit es bei der Parallelität mehrerer Threads nicht zu Fehlern kommt. In Java wird hauptsächlich die ThreadLocal-Klasse verwendet.

Join()-Methode

thread.Join fügt den angegebenen Thread zum aktuellen Thread hinzu und kann zwei abwechselnd ausgeführte Threads zu sequentiellen Ausführungsthreads zusammenführen. Wenn beispielsweise die Join()-Methode von Thread A in Thread B aufgerufen wird, wird Thread B nicht weiter ausgeführt, bis Thread A die Ausführung abgeschlossen hat.

t.join(); // Lassen Sie den aufrufenden Thread vorher die Ausführung abschließen.
t.join(1000); //Warten auf t Thread, die Wartezeit beträgt 1000 Millisekunden, unabhängig von der Zeitüberschreitung

public class JoinTest implements Runnable{  

    public static int a = 0;  

    public void run() {  
        for (int k = 0; k < 5; k++) {  
            a = a + 1;  
        }  
    }  

    public static void main(String[] args) throws Exception {  
        Runnable r = new JoinTest();  
        Thread t = new Thread(r);  
        t.start();        
        t.join();//等待t线程完成后输出,可保证a=5;
        System.out.println(a);  
    }         
}
Nach dem Login kopieren
Nach dem Login kopieren

wait()

Die Wartemethode des Objekts hat drei Ebenen Lademethode, von denen eine, wait(), auf unbestimmte Zeit (immer) wartet, bis andere Threads die Methode notify oder notifyAll aufrufen, um den aktuellen Thread aufzuwecken, wait(long timeout) und wait(long timeout, int nanos). ), Passieren zulassen. Geben Sie die Zeit ein, die der aktuelle Thread warten muss, bevor er aktiviert wird. Timeout ist die Anzahl der Millisekunden und Nanos ist die Anzahl der Nanosekunden.

notify()

Die Benachrichtigungsmethode weckt nur einen wartenden (Objekt-)Thread und veranlasst, dass der Thread mit der Ausführung beginnt. Wenn also mehrere Threads auf ein Objekt warten, aktiviert diese Methode nur einen der Threads. Welcher Thread ausgewählt werden soll, hängt von der Implementierung der Multithread-Verwaltung durch das Betriebssystem ab.

notifyAll()

notifyAll weckt alle wartenden Threads auf, obwohl es von der Betriebssystemimplementierung abhängt, welcher Thread ihn zuerst verarbeitet.
Diese Methoden können im „Produzenten-Verbraucher“-Problem verwendet werden. Der Verbraucher ist der Thread, der auf das Objekt in der Warteschlange wartet, und der Produzent ist der Thread, der das Objekt in der Warteschlange freigibt und andere Threads benachrichtigt.

So implementieren Sie Multithreading

● Erben Sie die Thread-Klasse, um eine Thread-Klasse zu erstellen, und überschreiben Sie die Ausführungsmethode. Die Ausführungsmethode stellt die Aufgabe dar, die der Thread ausführen muss () des Thread-Objekts, um den Thread zu starten. Die Thread-Klasse hat die Thread-Klasse geerbt und kann daher keine anderen übergeordneten Klassen erben.

class ThreadTest extends Thread {  

    Thread thread;  

    public ThreadTest(Thread thread) {  
      this.thread = thread;  
  }  

   @Override  
   public void run() {  
      synchronized (thread) {  
          System.out.println("getObjectLock");  
         try {  
             Thread.sleep(9000);  
       } catch (InterruptedException ex) {  
          ex.printStackTrace();  
         }  
           System.out.println("ReleaseObjectLock");  
    }  
   }  
 }
Nach dem Login kopieren
Nach dem Login kopieren

● Implementieren Sie die Runnable-Schnittstelle, um eine Thread-Klasse zu erstellen, definieren Sie die Runnable-Implementierungsklasse und überschreiben Sie die Ausführungsmethode.

  class RunnableImpl implements Runnable {  
    
      public void run() {  
          try {  
              System.out.println("Begin sleep");  
              Thread.sleep(2000);  
              System.out.println("End sleep");  
          } catch (InterruptedException e) {  
              e.printStackTrace();  
           }  
       }  
   }
Nach dem Login kopieren

● Implementieren Sie die Callable-Schnittstelle, schreiben Sie die call()-Methode neu und call() dient als Ausführung des Thread-Körpers mit Rückgabewert

● Thread-Pool, verwenden Sie den Thread-Pool, um Thread-Objekte zu generieren java.util.concurrent.ExecutorService, java.util.concurrent.Executors;

Wie Java die Thread-Sicherheit implementiert

● Sich gegenseitig ausschließende Synchronisierung: Es wird empfohlen, das synchronisierte Schlüsselwort für die Synchronisierung zu verwenden. Es gibt die ReentrantLock-Klasse und der Implementierungseffekt ist ähnlich original synchronisiert wird weiterhin empfohlen
● Blockierungsfreie Synchronisierung: Zur Ausführung sind Hardwareanweisungen erforderlich. Häufig verwendete Anweisungen sind: Test-and-Set Fetch-and-Increment Swap Compare-and-Swap (CAS) Load-Linked/Store-Conditional (LL/SC) Typische Anwendungen : AtomicInteger in
● Keine Synchronisierungslösung: Speichern Sie die Variablen im lokalen Thread, sodass keine gleichzeitigen Fehler mehrerer Threads auftreten. In Java wird hauptsächlich die ThreadLocal-Klasse verwendet.

Join()-Methode

thread.Join fügt den angegebenen Thread zum aktuellen Thread hinzu und kann zwei abwechselnd ausgeführte Threads zu sequentiellen Ausführungsthreads zusammenführen. Wenn beispielsweise die Join()-Methode von Thread A in Thread B aufgerufen wird, wird Thread B nicht weiter ausgeführt, bis Thread A die Ausführung abgeschlossen hat.

t.join(); // Lassen Sie den aufrufenden Thread die Ausführung vorher abschließen.
t.join(1000); //Warten auf t Thread, die Wartezeit beträgt 1000 Millisekunden, unabhängig von der Zeitüberschreitung

public class JoinTest implements Runnable{  

    public static int a = 0;  

    public void run() {  
        for (int k = 0; k < 5; k++) {  
            a = a + 1;  
        }  
    }  

    public static void main(String[] args) throws Exception {  
        Runnable r = new JoinTest();  
        Thread t = new Thread(r);  
        t.start();        
        t.join();//等待t线程完成后输出,可保证a=5;
        System.out.println(a);  
    }         
}
Nach dem Login kopieren
Nach dem Login kopieren

wait()

Die Wartemethode des Objekts hat drei Ebenen Lademethode, von denen eine, wait(), auf unbestimmte Zeit (immer) wartet, bis andere Threads die Methode notify oder notifyAll aufrufen, um den aktuellen Thread aufzuwecken, wait(long timeout) und wait(long timeout, int nanos). ), Passieren zulassen. Geben Sie die Zeit ein, die der aktuelle Thread warten muss, bevor er aktiviert wird. Timeout ist die Anzahl der Millisekunden und Nanos ist die Anzahl der Nanosekunden.

notify()

Die notify-Methode weckt nur einen wartenden (Objekt-)Thread und veranlasst den Thread, mit der Ausführung zu beginnen. Wenn also mehrere Threads auf ein Objekt warten, aktiviert diese Methode nur einen der Threads. Welcher Thread ausgewählt werden soll, hängt von der Implementierung der Multithread-Verwaltung durch das Betriebssystem ab.

notifyAll()

notifyAll weckt alle wartenden Threads auf, obwohl es von der Betriebssystemimplementierung abhängt, welcher Thread ihn zuerst verarbeitet.
Diese Methoden können im „Produzenten-Verbraucher“-Problem verwendet werden. Der Verbraucher ist der Thread, der auf das Objekt in der Warteschlange wartet, und der Produzent ist der Thread, der das Objekt in der Warteschlange freigibt und andere Threads benachrichtigt.

Das obige ist der detaillierte Inhalt vonMultithreading-Implementierung und Thread-Sicherheit in der Java-Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage