Este artigo resume principalmente o conhecimento relevante dos dados de compartilhamento de threads, que incluem principalmente dois aspectos: um é como compartilhar dados em um determinado thread para garantir que os dados de cada encadeamento não se cruzem; O outro é como compartilhar dados entre vários threads para garantir a consistência dos dados.
Se você mesmo implementar, definir um mapa, o thread é a chave e os dados são o valor. Cada item da tabela são os dados preparados para cada thread, para que os dados sejam consistentes em um thread.
exemplo
pacote com.iot.thread; importar java.util.hashmap; importar java.util.map; importar java.util.random;/*** criado por Brian em 2016/2/4. */public class ThreadScopeSharedata {// Prepare uma tabela de hash para preparar dados para cada thread mapa estático privado <thread, número inteiro> threadData = new hashmap <> (); public static void main (string [] args) {para (int i = 0; i <2; i ++) {new (runnable) {para (int i = 0; i <2; i ++) {new (»runnable) {para (int i = 0; i <2; i ++) {new (runnable) {{{{) Random (). NextInt (); ThreadData.put (Thread.CurrentThread (), Data); System.out.println (Thread.currentThread ()+"CUST DATES:"+Data); new A (). Get (); new B (). ThreadData.get (Thread.CurrentThread ()); System.out.println ("A de"+Thread.currentThread ()+"Get Data"+Data);}} estática classe B {public void get () {int data = thread.get (thread.currentThread ()); system.out.out.Int.PRAINT.PRINTLN " "+dados);}}}O código acima ocasionalmente relata exceções:
Exceção no thread "Thread-0" java.lang.nullPointerException
em com.iot.thread.threadscopeSharedata $ a.get (threadscopesharedata.java:29)
em com.iot.thread.threadscopeSharedata $ 1.run (threadscopesharedata.java:21)
em java.lang.thread.run (thread.java:745)
Eu não conheço o motivo específico ainda
API:
java.lang: classe Threadlocal <T>
Use o objeto Threadlocal em vez do mapa acima
Defina um objeto para encapsular várias variáveis e depois armazenar todo o objeto no Threadlocal
Quando multivariado, é melhor colocar a classe Threadlocal dentro da classe de dados. A classe de dados adota um modo Singleton, para que seja mais conveniente criar novos objetos e obter objetos e, ao mesmo tempo, é mais encapsulamento.
pacote com.iot.thread; importar java.util.random;/*** Criado por Brian em 2016/2/4. */public class ThreadLocalTest {private Static Threadlocal <Teger> threadinger = new Threadlocal <> (); public static void main (string [] args) {for (int i = 0; i <2; i ++) {new Thread (novo runnable () {@Override public void run () {) Random (). NextInt (100); Threadinger.Set (Data); System.out.println (Thread.CurrentThread ()+"Coloque dados:"+dados); mythreadScopeData.getThreadInstance (). A (). Get (); new b (). Get ();}}). Start ();}} estática classe A {public void get () {int data = threadinger.get (); system.out.println ("a de"+thread.curnthread ()+"get Data"+data); MythreadScopeData.getThreadInstance (); system.out.println ("a de"+mythreadScopedata);}} classe estática B {public void get () {int dataStrErTErtErtErt.get.get (); system.out.println ("b do"+. = MythreadScopeData.getThreadInstance (); System.out.println ("b de"+mythreadScopedata);}}}/*** Classe de dados que encapsulou o modo multivariado* Singleton, mythread de mythreadsCaTaMEd (mythreadsCopedScata, myThreadsCaTaMEd, myThreadsCaTaMEd*, mythreadsCaTaMEd*, mythreadsCaTaMEd*, mythreadswentsCaTaMEd, myThreadsCaTaMEd, myThreadsCaTaMEd (mythreadsCapedScAlTAd, myThreadsCaTAdScal. Threadlocal <MhyThreadScopeData> data = new Threadlocal <> (); public estático mythreadScopeData getThreadInstance () {mythreadScopeData instance = data.get (); if (instance == null) {instance = new mythreadScedAtATA (); int (instance == null) {instance = new mythreadsCopedata (); no nome; {Return name;} public void SetName (nome da string) {this.name = name;} public int getage () {retorna idade;} public void setage (int Age) {this.age = Age;}@substituir public string tostring () {string reval = Super.ToString ()+"-{Nome, Age}"+": {"+getName ()+","+getage ()+"}"; retorna revalorização;}}Várias maneiras
Um exemplo do último método:
Projete 5 fios, três fios aumentam em 1 de cada vez para J, e os outros dois threads diminuem em 1 de cada vez para j
pacote com.iot.thread;/*** Criado por Brian em 2016/2/4. */public class MutithreadSharedata {private estático 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.out.out.out.Pren.Pr) mutisharedata.getj ()+"+para:"+mutisharedata.increment ()+"}");}}). start ();} para (int i = 0; i <2; i ++) {new Thread (new Runnable () {@Override public void run () {System.out.out.Preth (Thread (new Runnable () {@Override public void run () {System.out.out.Preth (Thread (new Runnable () {@Override public void Run () {System.out.out.prind "+mutisharedata.getj ()+" - para: "+mutisharedata.decRement ()+"} ");}}). start ();}}}/** * encapsular dados compartilhados em outro objeto (o método de manipulação J = é concluído nesse objeto) */classi, mutisharedata {private int jej = j = jring j = j = jejation int; ++ j;} public sincronizado int decrement () {return --j;} public sincronizado int getj () {return j;} public sincronizado void setj (int j) {this.j = j;}}O exposto acima é toda a explicação detalhada do código de dados compartilhado com programação Java, espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!