В этой статье в основном суммируются соответствующие знания данных об обмене потоками, которые в основном включают в себя два аспекта: один из них заключается в том, как обмениваться данными в определенном потоке, чтобы гарантировать, что данные каждого потока не пересекаются; Другое - как обмениваться данными между несколькими потоками, чтобы обеспечить согласованность данных.
Если вы реализуете это самостоятельно, вы определяете карту, поток - это ключ, а данные - это значение. Каждый элемент в таблице - это данные, полученные для каждого потока, так что данные согласуются в одном потоке.
пример
пакет com.iot.thread; import java.util.hashmap; импорт java.util.map; import java.util.random;/*** Создан Брайаном 2016/2/4. */public Class ThreadScopeSharedata {// Подготовка хеш -таблицы для подготовки данных для каждой потоки частной статической карты <потока, integer> threaddata = new Hashmap <> (); public static void main (string [] args) {для (int i = 0; i <2; i ++) {new Runnable () {@at public roun Random (). Nextint ();; threaddata.put (think.currentthread (), data); system.out.println (thread.currentthread ()+"Поместить данные:"+data); new a (). Get (); new b (). Get ();}}). Start ();} static class a {public void get () {int () {int () {int () {int () {int () {int () {int ()}}}. threaddata.get (thread.currentThread ()); System.out.println ("a from"+thread.currentThread ()+"Get Data"+Data);}} Статический класс B {public void get () {int data = threaddata.get (thread.currentThread ()); system.out.println ("b -faT"+threadThreadThread (); system.out.out.println ("braT"+threadThardThread (); "+data);}}}Приведенный выше код иногда сообщает об исключениях:
Исключение в потоке "Thread-0" java.lang.nullPointerException
на com.iot.thread.threadscopesharedata $ a.get (threadscopesharedata.java:29)
at com.iot.thread.threadscopesharedata $ 1.run (ThreadScopesharedata.java:21)
на java.lang.thread.run (Thread.java:745)
Я пока не знаю конкретной причины
API:
java.lang: класс Threadlocal <T>
Используйте Threadlocal Object вместо вышеуказанной карты
Определите объект для инкапсуляции нескольких переменных, а затем хранить весь объект в Threadlocal
Когда многомерное, лучше всего разместить класс Threadlocal в класс данных. Класс данных принимает режим синглтона, так что будет более удобно создавать новые объекты и получать объекты, и в то же время это больше инкапсуляции.
пакет com.iot.thread; import java.util.random;/*** Создан Брайаном 2016/2/4. */public class Threadlocaltest {private static treadlocal <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 ()+"Поместить данные:"+data); mythreadScopedata.getThreadInstance (). SetName (thread.currentThread (). ToString (); mythreadScopedAta A (). Get (); new b (). Get ();}}). Start ();}} статический класс a {public void get () {int data = threadinger.get (); system.out.println ("a from"+thread.currentThread ()+"Get Data"+Data); Mythreadscopedata.getThreadInstance (); System.out.println ("a from"+mythreadscopedata);}} Статический класс B {public void get () {int data = thintinger.get (); system.out.println ("b from thread.currentThreadThreadTSC = Mythreadscopedata.getThreadInstance (); System.out.println ("b from"+mythreadscopedata);}}}/*** класс данных Экапсуляции многовариантных* синглтон Threadlocal <MythreadScopedata> data = new Threadlocal <> (); public static mythreadscopedata getThreadInstance () {mythreadScopedata encement = data.get (); if (exance == null) {exance = new mythreadscopedata (); data.set (экземпляр);} return nectle ancement; {return name;} public void setName (string name) {this.name = name;} public int getage () {return age;} public void setge (int age) {this.age = age;}@переопределить public String toString () {string reval = super.tostring ()+"-{name, age}"+": {"+getName ()+","+getage ()+"}"; return reval;}}Несколько способов
Пример последнего метода:
Дизайн 5 потоков, три потока увеличиваются на 1 каждый раз для j, а две другие потоки уменьшаются на 1 каждый раз для j
пакет com.iot.thread;/*** Создан Брайаном 2016/2/4. */public class mutithreadsharedata {private static mutisharedata mutisharedata = new mutisharedata (); public static void main (string [] args) {for (int i = 0; i <3; i ++) {new Threadab mutisharedata.getj ()+"+to:"+mutisharedata.increment ()+"}");}}). start ();} для (int i = 0; i <2; i ++) {new Thread (new Runnable () {@Override public run () {System.out.println (Thread.CurrentTh "+mutisharedata.getj ()+" - to: "+mutisharedata.decrement ()+"} ");}}). start ();}}}/** * Инкапсулирует общие данные в другой объект (метод манипулирования также завершается в этом объекте) */class mitishAtata {private int j = 0; Синхронизированный int decrement () {return --j;} public synchronized int getJ () {return j;} public synchronized void setj (int j) {this.j = j;}}Выше приведено подробное объяснение многопоточного кода общих данных Java, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!