Dieser Artikel fasst hauptsächlich die relevanten Kenntnisse über Thread -Sharing -Daten zusammen, die hauptsächlich zwei Aspekte enthält: Eine ist, wie Daten innerhalb eines bestimmten Threads freigegeben werden, um sicherzustellen, dass sich die Daten eines jeden Threads nicht überschneiden. Das andere ist, wie Daten zwischen mehreren Threads gemeinsam genutzt werden können, um die Konsistenz von Daten zu gewährleisten.
Wenn Sie es selbst implementieren, definieren Sie eine Karte, der Thread ist der Schlüssel und die Daten sind der Wert. Jedes Element in der Tabelle sind die für jeden Thread erstellten Daten, so dass die Daten in einem Thread konsistent sind.
Beispiel
Paket com.iot.thread; import Java.util.hashMap; Import Java.util.map; Import Java.util.Random;/*** Erstellt von Brian am 2016/2/4. */public Class ThreadScopesharedata {// Bereiten Sie eine Hash -Tabelle vor, um Daten für jeden Thread private statische Karte zu erstellen. Random (). NextInt (); ThreadData.put (Thread.currentThread (), data); System.out.println (Thread.CurrentThread ()+"Daten:"+data); new a (). Get (); new B (). Get ();}). threaddata.get (Thread.currentThread ()); System.out.println ("A von"+thread.currentThread ()+"data"+data);}} statische Klasse B {public void get () {int data = threaddata.get (Thread.current thead (); "+Daten);}}}Der obige Code meldet gelegentlich Ausnahmen:
Ausnahme im Thread "Thread-0" java.lang.nullpointerexception
bei com.iot.Thread.Threadscopesharedata $ A.get (Threadscopesharedata.java:29)
bei com.iot.thread.Threadscopesharedata $ 1.run (Threadscopesharedata.java:21)
bei java.lang.thread.run (thread.java:745)
Ich kenne den spezifischen Grund noch nicht
API:
Java.lang: Klasse ThreadLocal <T>
Verwenden Sie ThreadLocal -Objekt anstelle der obigen Karte
Definieren Sie ein Objekt, um mehrere Variablen zu verkapulieren und dann das gesamte Objekt in ThreadLocal zu speichern
Wenn Sie multivariate sind, ist es am besten, die ThreadLocal -Klasse in die Datenklasse zu platzieren. Die Datenklasse nimmt einen Singleton -Modus an, so dass es bequemer ist, neue Objekte zu erstellen und Objekte zu erhalten. Gleichzeitig ist es mehr Kapselung.
Paket com.iot.thread; import Java.util.random;/*** Erstellt von Brian am 2016/2/4. */public class threadLocalTest {private static ThreadLocal <GeNeger> threadinger = new ThreadLocal <> (); public static void main (String [] args) {für (int i = 0; i <2; i ++) {neuer Thread (neuer Runnable () {@Override öffentlicher void run () {in int data = newn New Random (). NextInt (100); threadinger.set (data); System.out.println (Thread.CurrentThread ()+"Data:"+data); Mytheadscopedata.GethreadInstance (). SetName (Thread.CurrentThread (). Tostring ()). A (). Get (); new b (). Get ();}}). Start ();}} statische Klasse A {public void get () {int data = threadinger.get (); System.out.println ("A von"+thread.current thread ()+"data"+data); Mytheadscopedata.getThreadinstance (); System.out.println ("A von"+Mytheadscopedata);}} statische Klasse B {public void get () {int data = threvinger.get (); System.out.println ("b aus"+threadthreadthreada ()+"data"+data); = MyThreadScopeData.getThreadInstance();System.out.println("B from "+myThreadScopeData);}}}/** * Data class encapsulating multivariables* Singleton mode, built-in ThreadLocal type variable*/class MyThreadScopeData{private MyThreadScopeData(){}private static ThreadLocal <Mytheadscopedata> data = new ThreadLocal <> (); public static mytheScopedata getThreadinstance () {MyThreadScopedata Instance = data.get (); if (Instance == null) {Instanzinstanze retance -stationSname; getName () {return name;} public void setName (String name) {this.name = name;} public int getage () {return ay;} public void setage (int ay) {this.age = älter;}@overside public String toString () {String reval Super.toString ()+"-{Name, Alter}"+": {"+getName ()+","+getage ()+"}"; return reval;}}Verschiedene Arten
Ein Beispiel für die letzte Methode:
Design 5 Threads, drei Threads erhöhen sich jeweils um 1 für J und die anderen beiden Threads nehmen jedes Mal für J um 1 ab, um 1 um 1
Paket com.iot.thread;/*** Erstellt von Brian am 2016/2/4. */public class mutithreadsharedata {private static mutisharedata mutisharedata = new mutisharedata (); public static void main (String [] args) {für (int i = 0; i <3; i ++) {neuer Thread (neuer Runnable () {@Override public void () {) {). "+mutisharedata.getj ()+"+bis: "+mutisharedata.increment ()+"} ");}}). "+mutisharedata.getJ ()+" - bis: "+mutisharedata.decrement ()+"} ");}}). Synchronisierte int detrement () {return --j;} public synchronisierte int getJ () {return j;} public synchronisierte void setj (int j) {this.j = j;}}Das obige ist die detaillierte Erklärung des Multi-Thread-Datencodes von Java-Programmierungen. Ich hoffe, dass dies für alle hilfreich sein wird. 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!