Hinweise zu den Grundlagen der gleichzeitigen Programmierung (1)

1. Thread

        Wenn es um Threads geht, muss jeder mit ihnen vertraut sein. Ein Thread ist eine Entität in einem Prozess. Der Thread selbst existiert nicht unabhängig. Ein Prozess ist eine laufende Aktivität von Code in einem Datensatz. Er ist die Grundeinheit des Systems Ressourcenzuweisung und -planung. Ein Thread ist ein Ausführungspfad, ein Prozess hat mindestens einen Thread und mehrere Threads in einem Prozess teilen sich die Ressourcen des Prozesses.

        Wenn das Betriebssystem Ressourcen zuweist, weist es Ressourcen Prozessen zu, aber CPU-Ressourcen sind etwas Besonderes: Sie werden Threads zugewiesen, sodass Threads tatsächlich CPU-Ressourcen belegen und ausgeführt werden, sodass Threads auch die Grundeinheit der CPU-Zuweisung sind.

        Wenn wir in Java die Hauptmethode starten, starten wir tatsächlich einen JVM-Prozess, und der Thread, in dem sich die Hauptfunktion befindet, ist der Hauptthread in diesem Prozess.

        Nachdem so viel Unsinn geredet wurde, ist es immer noch nicht so leicht zu verstehen wie ein Bild.

                                                                                                   Das Bild ist nicht sehr gut

        Aus der Abbildung können wir erkennen, dass es in einem Prozess mehrere Threads gibt und dass mehrere Threads den Methodenbereich und die Heap-Ressourcen des Prozesses und der Threads gemeinsam nutzen, jeder Thread jedoch über einen eigenen unabhängigen Programmzähler und Stapel verfügt. Die Frage ist noch einmal: Was sind der Programmzähler und der Stapel sowie der Heap- und Methodenbereich?

1.1 Programmzähler (Notepad)

        Der Programmzähler ist eigentlich ein Speicherbereich, der zum Aufzeichnen der Adresse der vom aktuellen Thread aufgezeichneten Thread-Ausführungsanweisung verwendet wird . Warum ist der Programmzähler privat? Wie oben erwähnt, ist der Thread etwas Besonderes und stellt die grundlegendste Einheit der CPU-Ausführung dar. Die CPU verwendet im Allgemeinen die Zeitscheibenrotationsmethode, um dem Thread die Abfrage zu ermöglichen. Daher muss die CPU nach Ablauf der aktuellen Thread-CPU-Zeitscheibe aufgebraucht sein Gib auf und warte auf die nächste Runde. Führe es aus, wenn du es selbst ausführst. Woher wissen Sie also, wo dieser Thread ausgeführt wird? Tatsächlich zeichnet der Programmzähler die Adresse auf, die der Thread ausführt, wenn er die CPU aufgibt . Wenn er der Zeitscheibe neu zugewiesen wird, kann der Thread die Ausführung von der durch seinen eigenen privaten Zähler angegebenen Adresse fortsetzen.

1,2 Stapel (tiefes Geheimnis)

       Jeder Thread verfügt über eine eigene Stapelressource, die zum Speichern lokaler Variablen und Referenzadressen benutzerdefinierter Objekte verwendet wird . Diese lokalen Variablen, diese lokalen Variablen, sind für den Thread privat und können von anderen Threads nicht aufgerufen werden. Threadlocal wird später eingeführt. Wunderbar. Darüber hinaus wird der Stapel auch zum Speichern des Stapelrahmens (Thread-Aufrufdatensatz) des Thread-Aufrufs verwendet .

1.3 Heap (Heimat eines realen Objekts, dieses Objekt ist nicht dieses Objekt)

        Der Heap ist der größte Speicherbereich in einem Prozess. Der Heap wird von allen Threads im Prozess gemeinsam genutzt und beim Erstellen des Prozesses zugewiesen. Das Heap-Objekt speichert hauptsächlich reale Instanzen neuer benutzerdefinierter Objekte .

1.4 Methodenbereich (die Heimat der kompilierten Klasse)

        Der Methodenbereich wird zum Speichern von Informationen wie von der JVM geladenen Klassen, Konstantenpools und statischen Variablen verwendet und wird auch von Threads gemeinsam genutzt. Hier möchte ich erklären, dass JAVA jdk unterschiedliche Dinge im Methodenbereich verschiedener Versionen platziert.

1.6: Laufzeitkonstantenpool, Klassenmetadateninformationen, statische Variablen, vom Compiler kompilierter Code usw.

1.7: Der Speicher ist grundsätzlich derselbe wie 1.6, außer dass der Konstantenpool herausgenommen und nicht im Methodenbereich gespeichert wird.

2. Erstellung und Betrieb eines JAVA-Threads

        In Java gibt es drei Thread-Erstellungsmethoden: Die Run-Methode implementiert die Runnable-Schnittstelle, integriert die Thread-Klasse und schreibt die Run-Methode neu und verwendet die FutureTask-Methode (mit Rückgabewert ) .

2.1 Implementieren Sie die Runnable-Schnittstelle

public class ThreadTest {

	public static class RunnableTask implements Runnable {
		@Override
		public void run() {
			System.out.println("implements Runnable Thread");
		}
		
	}
	public static void main(String[] args) {
		RunnableTask runnableTask =new RunnableTask();
		new Thread(runnableTask).start();
	}
}

2.2 Erben der Thread-Klasse

public static class ThreadTask extends Thread{
		
		@Override
		public void run() {
			System.out.println("extends Thread");
		}
	}
	
	public static void main(String[] args) {
		ThreadTask threadTask =new ThreadTask();
		threadTask.start();
	}

2.3 Implementieren Sie die Callable-Schnittstelle

//创建一个CallableTask 实现Callable接口中的run方法
public static class CallableTask implements Callable<String>{

		@Override
		public String call() throws Exception {
			return "callable ruturn";
		}
	}
	public static void main(String[] args) {
		//FutureTask构造函数传入一个CallableTask实例
		FutureTask<String> futureTask=new FutureTask<String>(new CallableTask());
		new Thread(futureTask).start();
		try {
			//等待任务执行完成,获取返回值
			String result = futureTask.get();
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Die oben beschriebenen Codes haben ihre eigenen Vor- und Nachteile. Beispielsweise unterstützt Java nur die Einzelvererbung und es gibt keinen Rückgabewert, wenn Runnable implementiert und die Thread-Klasse geerbt wird. Die ersten beiden Implementierungen können das Ergebnis der Aufgabenrückgabe nicht zurückerhalten, FutureTask jedoch.

Fortgesetzt werden. . .

Nachschlagewerk: Die Schönheit der gleichzeitigen JAVA-Programmierung – Zhai Lianxue Bintian

Ich denke du magst

Origin blog.csdn.net/m0_37506254/article/details/121323596
Empfohlen
Rangfolge