Este artículo resume principalmente el conocimiento relevante de los datos de intercambio de subprocesos, que incluye principalmente dos aspectos: uno es cómo compartir datos dentro de un cierto hilo para garantizar que los datos de cada hilo no se cruzan; El otro es cómo compartir datos entre múltiples hilos para garantizar la consistencia de los datos.
Si lo implementa usted mismo, define un mapa, el hilo es la clave y los datos son el valor. Cada elemento de la tabla son los datos preparados para cada hilo, de modo que los datos son consistentes en un hilo.
ejemplo
paquete com.iot.thread; import java.util.hashmap; import java.util.map; import java.util.random;/*** creado por Brian el 2016/2/4. */public class ThreadScopesharedata {// Prepare una tabla hash para preparar datos para cada hilo Mapa estático privado <Thread, Integer> ThreadData = new HashMap <> (); public static void main (string [] args) {for (int i = 0; i <2; i ++) {new Thread (new Runnable () {@Override Public Void Run () {INTO DATA = ITAT. Random (). NextInt (); ThreadData.put (Thread.CurrentThread (), Data); System.out.println (Thread.CurrentThread ()+"Pon Data:"+Data); New A (). Get (); New B (). ThreadData.get (Thread.CurrentThread ()); System.out.println ("A From"+Thread.CurrentThread ()+"Get Data"+Data);}} Static Class B {public void get () {int data = ThreadData.get (thread.CurrentThadThread ()); System.out.Println ("B de"+CHUST.CURRENTTROREN "+datos);}}}El código anterior ocasionalmente informa excepciones:
Excepción en el hilo "Thread-0" java.lang.nullpointerException
en com.iot.thread.threadscopesharedata $ a.get (Threadscopesharedata.java:29)
en com.iot.thread.threadscopesharedata $ 1.run (ThreadScopesharedata.java:21)
en java.lang.thread.run (Thread.java:745)
Todavía no sé la razón específica
API:
java.lang: clase ThreadLocal <T>
Use el objeto ThreadLocal en lugar del mapa anterior
Definir un objeto para encapsular múltiples variables y luego almacenar todo el objeto en ThreadLocal
Cuando es multivariado, es mejor colocar la clase ThreadLocal dentro de la clase de datos. La clase de datos adopta un modo singleton, por lo que será más conveniente crear nuevos objetos y obtener objetos, y al mismo tiempo es más encapsulación.
paquete com.iot.thread; import java.util.random;/*** creado por Brian el 2016/2/4. */public class ThreadLocalTest {private Static ThreadLocal <Integer> Threadinger = new ThreadLocal <> (); public static void main (String [] args) {for (int i = 0; i <2; i ++) {new Thread (new Runnable () {@Override public void run () {int data = new New Random (). NextInt (100); Threadinger.set (data); System.out.println (Thread.CurrentThread ()+"Pon Data:"+Data); MyThreadScopedata.getThreadInstance (). SetName (Thread.CurrentThread (). ToString ()); A (). Mythreadscopedata.getThreadInstance (); system.out.println ("A de"+myThreadScopedata);}} clase estática B {public void get () {int data = threadinger.get (); system.out.println ("b de"+thread.currentThread ()+"obtener datos"+data); mythreadscopedscopedatataatataatataatataatatataATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATA. Mythreadscopedata.getThreadInstance (); system.out.println ("b from"+mythreadscopedata);}}}/*** clase de datos encapsulando multivariables* mode singleton, typle de threadlocal integrado variable*/class mythreadscopedata {private mythreadscopedata () {{} {} privado shifhatal variable statical*/class mythreadscopedata {private mythreadscopedata () {{{} {} privado shifhatal variable statical*/class Mythreadscopedata {private MyThreadScopedata () {{} {} {} privado STARTLOCAL VARIABLE data = new ThreadLocal <> (); public static myThreadScopedata getThreadInstance () {myThreadScopedata instance = data.get (); if (instancia == null) {instancia = new MyThreadScopedata (); data.set (instancia);} return Instance;} String private String Name; Private int Age; public String GetName () {return name;} {this.name = name;} public int getAge () {return Age;} public void setage (int a age) {this.age = age;}@anular public String toString () {String reval = super.ToString ()+"-{name, age}"+": {"+getName ()+"+getage ()+"} ";Varias formas
Un ejemplo del último método:
Diseñar 5 hilos, tres hilos aumentan en 1 cada vez para J, y los otros dos hilos disminuyen en 1 cada vez para J
paquete com.iot.thread;/*** creado por Brian el 2016/2/4. */public class MutithreadSharedata {private static satatic mutisharedata mutisharedata = new mutisharedata (); public static void main (string [] args) {for (int i = 0; i <3; i ++) {new Thread (new Runnable () {@Override public void run () {System.Println (Thread.currentThread () mutishareData.getj ()+"+a:"+mutishareData.increment ()+"}");}}). start ();} for (int i = 0; i <2; i ++) {new Thread (new RunNable () {@Override public "+mutisharedata.getj ()+" - a: "+mutisharedata.DeCrement ()+"} ");}}). start ();}}}/** * Encapsula datos compartidos en otro objeto (el método de manipulación de datos también se completa en ese objeto) */class Muthisharedata {Private int j = 0; Public sincronizado Increment () sincronizado int decrement () {return --j;} public sincronizado int getj () {return j;} public sincronizado sincronizado setj (int j) {this.j = j;}}Lo anterior es toda la explicación detallada del código de datos compartidos de múltiples subconjuntos de Java, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!