Cet article résume principalement les connaissances pertinentes des données de partage de threads, qui comprennent principalement deux aspects: l'un est de savoir comment partager les données dans un certain thread pour s'assurer que les données de chaque thread ne se croisent pas; L'autre est de savoir comment partager les données entre plusieurs threads pour assurer la cohérence des données.
Si vous l'implémentez vous-même, vous définissez une carte, le thread est la clé et les données sont la valeur. Chaque élément de la table est les données préparées pour chaque thread, de sorte que les données sont cohérentes dans un thread.
exemple
package com.iot.thread; import java.util.hashmap; import java.util.map; import java.util.random; / ** * créé par Brian le 2016/2/4. * / classe publique ThreadSpespeharedata {// Préparez une table de hachage pour préparer des données pour chaque thread STATIC MAP STATIQUE <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 () {int Data = New () Random (). NextInt (); threadData.put (thread.currentThread (), data); system.out.println (thread.currentThread () + "put data:" + data); new a (). Get (); new b (). Get ();}}). Start ();}} static class a {public void get () {int data threadData.get (thread.currentThread ()); System.out.println ("A de" + thread.currentThread () + "Get Data" + Data);}} Static Class B {public void get () {int data = threadData.get (thread.currentThread ()) "+ données);}}}Le code ci-dessus rapporte parfois des exceptions:
Exception dans Thread "Thread-0" java.lang.nullpointerException
sur com.iot.thread.threadsopesharedata $ a.get (threadsopesharedata.java:29)
sur com.iot.thread.threadsopesharedata 1 $.
sur java.lang.thread.run (thread.java:745)
Je ne connais pas encore la raison spécifique
API:
java.lang: classe threadlocal <T>
Utilisez un objet threadlocal au lieu de la carte ci-dessus
Définissez un objet pour encapsuler plusieurs variables, puis stocker l'objet entier en threadlocal
Lorsqu'il est multivarié, il est préférable de placer la classe threadlocal à l'intérieur de la classe de données. La classe de données adopte un mode singleton, de sorte qu'il sera plus pratique de créer de nouveaux objets et d'obtenir des objets, et en même temps, il s'agit d'une encapsulation plus.
package com.iot.thread; import java.util.random; / ** * créé par Brian le 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 Random (). NextInt (100); threadinger.set (data); system.out.println (thread.currentThread () + "Put Data:" + Data); myThreadscopedata.getThreadInstance (). SetName (Thread.CurrentThreadread (). TOSTRING ()); Mythreadscopedata.getThreadInStance (). Setage. A (). Get (); new b (). Get ();}}). Start ();}} classe statique a {public void get () {int data = threadinger.get (); system.out.println ("a de" + thread.currentThread () + "get data" + data); mythreadscopedataReadscomedata = MyThreadscopedata.getThreadInstance (); System.out.println ("A de" + MythreadScopeData);}} classe statique B {public void get () {int data = threadinger.get (); System.out.println ("b à partir de" + threintaRaRed () + "Obtenir des données" + données); = MyThreadscopedata.getThreadInstance (); System.out.println ("B From" + MythreadscopeData);}}} / ** * Classe de données encapsulat Multivariables * Singleton Mode, Type de file intégré ThreadLocal <MyThreadscopeData> data = new ThreadLocal <> (); public static mythreadscopedata getThreadInstance () {mythreadscopedata instance = data.get (); if (instance == null) {instance = new MythreadscopeData (); data.set (instance);} return instance;} privily name; privil {return name;} public void setName (String name) {this.name = name;} public int getage () {return age;} public void sexe (int age) {this.age = age;} @ override public String toString () {String revéal = super.toString () + "- {nom, âge}" + ": {" + getName () + "," + getage () + "}"; return revel;}}Plusieurs manières
Un exemple de la dernière méthode:
Conception 5 fils, trois fils augmentent de 1 à chaque fois pour J, et les deux autres threads diminuent de 1 à chaque fois pour J
package com.iot.thread; / ** * créé par Brian le 2016/2/4. * / classe publique Mutithreadsharedata {private static 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.out.printLn (ThreadRentShread (). "+ mutisharedata.getj () +" + à: "+ mutisharedata.increment () +"} ");}}). start ();} for (int i = 0; i <2; i ++) {new Thread (new Runnable () {@Override public Void ran () {System.out.println (Thread.Currenthread () +" "+ mutisharedata.getj () +" - to: "+ mutisharedata.decment () +"} ");}}). start ();}}} / ** * encapsulent les données partagées dans un autre objet (la méthode de manipulation des données est également complétée dans cet objet) * / class mutisharedata {private int j = 0; public Symchron Indgrament (Retour + synchronisé int décrément () {return --j;} public synchronisé int getj () {return j;} public synchronisé void setj (int j) {this.j = j;}}Ce qui précède est toute l'explication détaillée du code de données partagé multithread Java Programming, j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!