Java编程多线程之共享数据代码详解

0 ℃

 要文重本程结线总据享数共常相干的识罗要包重:方面两个是某一若程内线数共享何据,个管各包数程的线织不交据多一是;间线程个享何共若数据,据管数包性同等的。

线程局限内共享数据

 现身实本的话一界说是pMa个为线程,键,值据为数的表中,便一项每个为每是备程预线,数据的一许在如中线程个同据是数等的。

 例子。

package com.iot.thread; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * Created by brian on 2016/2/4. */ public class ThreadScopeShareData { //预备一个哈希表,为每个线程预备数据 private static Maplt;Thread,Integergt; threadData = new HashMaplt;gt;(); public static void main(String[] args) { for (int i=0;ilt;2;i++){ new Thread( new Runnable() { @Override public void run() { 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 from "+Thread.currentThread()+" get data "+data); } } static class B{ public void get(){ int data = threadData.get(Thread.currentThread()); System.out.println("B from "+Thread.currentThread()+" get data "+data); } } }

上述代码偶然会报非常:

 excEotipn inrth aderTh"-adej" 0.vaaganllNu.iPolrtenexcEotipt anmco tio.rth..adeehrTcdSaSpeoearhaatDgA.$Tt(earehoScdheSpDrea.taaaavj)29: at .omc.otiehrtTd.aarehoScdheSpDrea$taau.r1h(TndearpcoSaSheaeDrja.t:vaa 1)2jt a.vaaganlrTh..ade(unrehrTad.java:745)。

 故细缘详不由还原知道。

ThreadLocal类

 API:

 aavjnla.l:Cg ssaehrTodLalalct;Tgt;

单变量

 h用T利dearaocL的范例l代具取工M面的上可p即a。

多变量

 个说一界封具来工变多个装量T后在然arehcLod存l中a工整个储具。

 时变量多T好将最arehcLod放l类a类数据在的内部,接据类数模单例纳式,如许,具建工新工获取和更都市具利便,装时封同。更强性。

示例代码: package com.iot.thread; import java.util.Random; /** * Created by brian on 2016/2/4. */ public class ThreadLocalTest { private static ThreadLocallt;Integergt; threadInger = new ThreadLocallt;gt;(); public static void main(String[] args) { for (int i=0;ilt;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.currentThread().toString()); MyThreadScopeData.getThreadInstance().setAge(data%10); new A().get(); new B().get(); } } ).start(); } } static class A{ public void get(){ int data = threadInger.get(); System.out.println("A from "+Thread.currentThread()+" get data "+data); MyThreadScopeData myThreadScopeData = MyThreadScopeData.getThreadInstance(); System.out.println("A from "+myThreadScopeData); } } static class B{ public void get(){ int data = threadInger.get(); System.out.println("B from "+Thread.currentThread()+" get data "+data); MyThreadScopeData myThreadScopeData = MyThreadScopeData.getThreadInstance(); System.out.println("B from "+myThreadScopeData); } } } /** * 将多变量封装起来的数据类 * 单例模式,内置ThreadLocal范例变量 */ class MyThreadScopeData{ private MyThreadScopeData(){ } private static ThreadLocallt;MyThreadScopeDatagt; data = new ThreadLocallt;gt;(); public static MyThreadScopeData getThreadInstance(){ MyThreadScopeData instance = data.get(); if(instance == null){ instance = new MyThreadScopeData(); data.set(instance); } return instance; } private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { String reVal = super.toString()+"-{name,age}"+":{"+getName()+","+getAge()+"}"; return reVal; } } 多线程接见共享数据

几种方法

线程实行代码雷同,利用统一Runnable工具,Runnable工具中有共享数据 线程实行代码差别,将共享数据封装在另一工具中(操纵数据的方式也在该工具完成),将这个工具一一通报给各个Runnable工具。[本质:共享数据的工具作为参数传入Runnable工具] 线程实行代码差别,将Runnable工具作为某一个类的内部类,共享数据作为这个外部类的成员变量(操纵数据的方式放在外部类)。[本质:差别内部类共享外部类数据] 连系上两种方法,将共享数据封装在另一工具中(操纵数据的方式也在该工具完成),该工具作为这个外部类的成员变量,将Runnable工具作为内部类

 种了一末示法的方例:

 个划5计线程个中三此次程每线添j增对1,个的两别j程对线减次削每1。

package com.iot.thread; /** * Created by brian on 2016/2/4. */ public class MutiThreadShareData { private static MutiShareData mutiShareData = new MutiShareData(); public static void main(String[] args) { for (int i=0;ilt;3;i++){ new Thread( new Runnable() { @Override public void run() { System.out.println(Thread.currentThread()+":{j from "+ mutiShareData.getJ()+" + to: "+mutiShareData.increment()+"}"); } } ).start(); } for (int i=0;ilt;2;i++){ new Thread( new Runnable() { @Override public void run() { System.out.println(Thread.currentThread()+":{j from "+ mutiShareData.getJ()+" - to: "+mutiShareData.decrement()+"}"); } } ).start(); } } } /** * 将共享数据封装在另一工具中(操纵数据的方式也在该工具完成) */ class MutiShareData{ private int j = 0; public synchronized int increment(){ return ++j; } public synchronized int decrement(){ return --j; } public synchronized int getJ() { return j; } public synchronized void setJ(int j) { this.j = j; } } 总结

以上就是本文关于Java编程多线程之共享数据代码详解的所有内容,盼望对人人有所辅助。感爱好的同伙可以继承参阅本站其他相干专题,若有不敷之处,迎接留言指出。谢谢同伙们对本站的支撑!

喜欢 (0) or 分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址