Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Implementierungsmethode der Java-Thread-Synchronisation (mit Code)

Detaillierte Erläuterung der Implementierungsmethode der Java-Thread-Synchronisation (mit Code)

不言
不言nach vorne
2018-10-19 16:14:172633Durchsuche

Dieser Artikel enthält eine detaillierte Erläuterung der Implementierungsmethode der Java-Thread-Synchronisierung (mit Code). Ich hoffe, dass er für Freunde hilfreich ist.

Warum Thread-Synchronisierung

Wenn mehrere Threads auf derselben Ressource, z. B. Dateien, ausgeführt werden, können wir nicht zulassen, dass mehrere Threads gleichzeitig ausgeführt werden diese Datei. Denn wenn Dateien gemeinsam genutzt werden, kommt es zu Konflikten zwischen mehreren Vorgängen. Ich glaube, dass Leute, die Git für die Teamentwicklung verwendet haben, über umfassende Erfahrung im Preisvergleich verfügen werden.

Zu diesem Zeitpunkt muss der Thread-Synchronisationsmechanismus eingeführt werden.

Die sogenannte Synchronisierung bezieht sich auf die Ausführung nacheinander, d. Auf diese Weise wird es keine Kämpfe und keine Konflikte geben.

Problembeschreibung

Ein Programm mit zwei Threads. Der erste Thread berechnet gerade Zahlen und Zahlen zwischen 2 und 1000, und der zweite Thread berechnet 1000. Gerade Zahlen und Zahlen zwischen ~2000.

Erste Implementierung

Lassen Sie uns zunächst die Implementierungsmethode entsprechend dem Thema entwerfen.

1. Definieren Sie zwei Threads. Hier müssen Sie Ihre eigene Thread-Klasse definieren und dann den Beginn und das Ende der Berechnung gerader Zahlen festlegen
2 Implementieren Sie die Berechnung gerader Zahlen und die Anzahl der geraden Zahlen innerhalb des angegebenen Bereichs
3 🎜>

Sie sehen: Die Umsetzung ist einfach. Die vorläufige Implementierung ist wie folgt:

1. Definieren Sie Ihre eigene Thread-Klasse:

public class MyTread extends Thread {
    private int begin;          // 范围开始
    private int end;            // 范围结束

    public MyTread(int begin, int end) {
        this.begin = begin;
        this.end = end;
    }
}

2. Implementieren Sie die Berechnung von geraden Zahlen und geraden Zahlen

@Override
public void run() {
    this.getEven(begin, end);
}

// 获取偶数以及个数
private void getEven(int begin, int end) {
    int count = 0;
    System.out.println(begin + "~" + end + "之间的偶数为:");
    if (begin % 2 != 0) {
        begin += 1;
    }

    for (; begin  <p>3. Initialisieren Sie den Thread und führen Sie ihn aus <strong></strong></p><pre class="brush:php;toolbar:false">public static void main(String[] args) {
    MyTread tread1 = new MyTread(2, 500);
    MyTread tread2 = new MyTread(500, 1000);
    tread1.start();
    tread2.start();
}

Hinweis: Um den späteren Effekt anzuzeigen, muss der Der Nummernkreis wird reduziert.

Sehen Sie sich die Ergebnisse an:

Detaillierte Erläuterung der Implementierungsmethode der Java-Thread-Synchronisation (mit Code)

Es scheint nicht der gewünschte Effekt zu sein. Wir möchten diesen Effekt:

Detaillierte Erläuterung der Implementierungsmethode der Java-Thread-Synchronisation (mit Code)

Wir möchten, dass die geraden und geraden Zahlen jedes Teils zusammen sind, aber der Effekt nach der Implementierung ist tatsächlich Zwei Es entstehen Teile der Verwirrung.

Verfahrensverbesserung

Um die oben genannten Probleme zu lösen, müssen wir das

verwenden, über das wir am Anfang gesprochen haben. 线程同步

Gemäß unserer ersten Einführung haben wir festgestellt, dass eine Voraussetzung für die Synchronisierung darin besteht, ein

zu haben. Was ist also dieses 共享的资源 in unserem Code? Es scheint nicht. Erstellen Sie also zuerst eines. 共享的资源

1. Gemeinsame Ressourcen erstellen

Die gemeinsamen Ressourcen, die wir hier haben, können

sein, daher erstellen wir eine weitere Klasse, um gemeinsame Ressourcen zu veranschaulichen. 同一个对象

public class Even {}

2. Erstellen Sie dann eine Methode zur Berechnung gerader Zahlen in der gemeinsam genutzten Klasse:

public class Even {
    /**
     * 获取某个范围内偶数以及个数
     * @param begin 统计开始
     * @param end   统计结束
     */
    public synchronized void getEven(int begin, int end) {
        int count = 0;
        System.out.println(begin + "~" + end + "之间的偶数为:");
        if (begin % 2 != 0) {
            begin += 1;
        }

        for (; begin Aufmerksame Leute werden feststellen, dass sich diese Methode ein wenig von der von uns unterscheidet ursprünglich geschrieben, es hat ein weiteres Schlüsselwort: <p>. Durch dieses Schlüsselwort können wir beim Ausführen von Methoden eine Thread-Synchronisation erreichen. <code>synchronized</code></p><p>3. Rufen Sie schließlich die gemeinsam genutzte Methode im Thread auf <strong></strong></p><pre class="brush:php;toolbar:false">public class MyTread extends Thread {
    Even even;
    
    @Override
    public void run() {
        even.getEven(begin, end);
    }
}
Führen wir sie jetzt noch einmal aus:

Detaillierte Erläuterung der Implementierungsmethode der Java-Thread-Synchronisation (mit Code)

Wir haben den gewünschten Effekt erzielt.

Zuletzt ist der komplette Code angehängt:

/**
 * 偶数类
 */
public class Even {
    /**
     * 获取某个范围内偶数以及个数
     * @param begin 统计开始
     * @param end   统计结束
     */
    public synchronized void getEven(int begin, int end) {
        int count = 0;
        System.out.println(begin + "~" + end + "之间的偶数为:");
        if (begin % 2 != 0) {
            begin += 1;
        }

        for (; begin <p class="comments-box-content"><br></p>

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Implementierungsmethode der Java-Thread-Synchronisation (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen