1. Semaphor
Sprechen wir zuerst über Semaphore. Semaphor kann die Anzahl der Ressourcen kontrollieren, auf die gleichzeitig zugegriffen werden kann, eine Lizenz über Accire () erhalten, warten, ob es nein gibt, und Release () veröffentlicht eine Lizenz. Es wird im Allgemeinen verwendet, um die Anzahl der gleichzeitigen Threads und die gegenseitige Ausschluss zwischen Threads zu steuern. Darüber hinaus kann das Re -Enterantlock diese Funktion auch implementieren, die Implementierung ist jedoch komplizierter.
Die Funktion ähnelt allen 5 Gruben in der Toilette. Wenn 10 Personen auf die Toilette gehen müssen, wie viele Menschen können dann nur gleichzeitig auf die Toilette gehen? Gleichzeitig können nur 5 Personen es besetzen. Wenn einer der fünf Menschen beiseite zieht, kann einer der anderen 5 Personen, die warten, es besetzen. Darüber hinaus können sie unter den 5, die warten, zufällig vorrangige Möglichkeiten erhalten oder Möglichkeiten erhalten, um zuerst zu kommen und dann zu kommen.
Ein einzelnes Semaphor -Objekt kann die Funktion eines Mutex implementieren und von einem Thread erhalten und von einem anderen Thread freigegeben werden. Dies kann in einigen Fällen von Deadlock -Erholung angewendet werden.
Beispiel:
/** * @Description: * @param @param args * @return void return type */public static void main (String [] args) {// Thread Pool ExecutorService exec = ausführende.newcachedThreadpool (); // Nur 5 Threads können auf endgültige Semaphor -SEMP = New Semaphor (5) zugreifen; // Simulate 20 Client -Zugriff für (int index = 0; index <20; index ++) {endgültig int no = index; Runnable run = new Runnable () {public void run () {try {// Erlaubnis semp.acquire (); System.out.println ("Zugriff:" + no); Thread.sleep ((lang) (math.random () * 10000)); // nach dem Zugriff semp.release (); System.out.println ("restableAnlableable signals----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Ausgabeergebnis (Überlegen Sie, warum es so ausgibt):
Zugriff erhalten: 1 Zugriff erhalten: 5 Zugriff erhalten: 2 Zugriff erhalten: 3 Zugriff erhalten: 0 verbleibend verfügbar Signal --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------— ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 13 verbleibende Signale ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2. Verwenden Sie Rohr als Brücke zwischen den Gewinnen
Pipe hat einen Quellkanal und einen Sinkkanal. Die Daten werden in den Sinkkanal geschrieben und aus dem Quellkanal gelesen. Eins in und eins aus. Lassen Sie uns zuerst lernen, wie man es benutzt.
Es ist erwähnenswert, dass diese Klasse unter java.nio.channels angibt, dass die Datenkommunikationsmethode der NIO -Methode verwendet wird. Verwenden Sie also einen Puffer, um Daten zu puffern.
Illustration des Rohrprinzips:
Rohr ist ein leeres Rohr. Ein Ende dieses leeren Rohrs kann aus der Innenseite des Rohrs gelesen werden und das andere Ende kann in das Rohr geschrieben werden.
Betriebsprozess:
1. Erstens muss es ein Objekt geben, um es in diese leere Röhre zu schreiben. Wohin schreiben? Dieses leere Rohr hat einen kleinen Platz, direkt in diesem Rohr.
Beim Schreiben wird es in den in der Pfeife selbst enthaltenen Raum geschrieben. Diese Raumgröße beträgt 1024 Bytes.
2. Dann kann ein weiteres Objekt den Inhalt dieses gefüllten Röhrchens vorlesen.
Auf dem Code
package com.jx.test;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.Pipe;public class testPipe {/** * @Description: * @param @param args * @return void Return type* @throws IOException */public static void main(String[] args) throws IOException {// Create a Pipeline Pipe pipe = pipe.open (); endgültige Rohre {System.out.println ("Senden ......"); // einen Thread erstellen und die Write Port Pipe des Rohrs verwenden. res);} catch (Ausnahme e) {e.printstacktrace ();}}}; Thread tPReader = neuer Thread () {public void run () {int bbuffersize = 1024 * 2; des Pipeline pipe.sourcechannel -Typs psoc zum Lesen des Inhalts in der Pipeline in den angegebenen Bytebuffer int res = psoc.read (BBuffer); // Die Daten sind nicht system.out.println ("RECIVE -Größe:"+res+"Inhalt:"+bytebuffertostring (BBuffer);} Fangsfasse (Ausnahme E) (Ausnahme) E) E. EIN) E. EIN) E. ENGEBOT (AUSGABE E); oder content.remaining ()) {system.out.println ("Nicht existiert oder der Inhalt ist leer!"); return null;} int contentSize = content.limit () - content resultStr.toString ();}}Zusammenfassen
In dem obigen dreht sich alles um die Beispiele für Java-Programmierkommunikation und Semaphore-Code in diesem Artikel. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!