この記事では、主にスレッド共有データの関連する知識をまとめています。これには、主に2つの側面が含まれています。1つは、特定のスレッド内でデータを共有して、各スレッドのデータが交差しないことを確認する方法です。もう1つは、データの一貫性を確保するために複数のスレッド間でデータを共有する方法です。
自分で実装すると、マップを定義し、スレッドがキーであり、データは値です。テーブル内の各アイテムは、各スレッドに準備されたデータであるため、データは1つのスレッドで一貫しています。
例
パッケージcom.iot.thread; import java.util.hashmap; Import java.util.map; Import java.util.random;/*** Brianが2016/2/4に作成しました。 */public class threadscopesharedata {//ハッシュテーブルを準備して各スレッドのデータを準備するプライベート静的マップ<スレッド、integer> threaddata = new hashmap <>(); public static void main(string [] args){for(int i = 0; i <2; i ++){new runnable(){new runride(){new runride run() random()。nextInt(); shooddata.put(thread.currentthread()、data); system.out.println(thread.currentthread()+"put data:"+data); new a(); new b(); new b()。get();}}) threaddata.get(thread.currentthread()); system.out.println( "a from"+thread.currentthread()+"get data"+data);}} static class b {int data = threaddata.get()shood.currentthread()); system.out.out.Out.println() "+data);}}}上記のコードは、時々例外を報告します。
スレッド「Thread-0」Java.lang.nullpointerexceptionの例外
com.iot.thread.thread.threadscopesharedata $ a.get(threadscopesharedata.java:29)
com.iot.thread.thread.threadscopesharedata $ 1.run(threadscopesharedata.java:21)
at java.lang.thread.run(thread.java:745)
私はまだ特定の理由を知りません
API:
Java.lang:クラススレッドロカル<t>
上記のマップではなく、threadlocalオブジェクトを使用します
複数の変数をカプセル化するオブジェクトを定義し、オブジェクト全体をthreadlocalに保存します
多変量の場合、Threadlocalクラスをデータクラス内に配置することをお勧めします。データクラスはシングルトンモードを採用しているため、新しいオブジェクトを作成してオブジェクトを取得する方が便利になり、同時によりカプセル化されます。
パッケージcom.iot.thread; Import java.util.random;/*** 2016/2/4にBrianが作成しました。 */public class threadlocaltest {private static threadlocal <integer> threadinger = new threadlocal <>(); public static void main(string [] args){for(int i = 0; i <2; i ++){new runnable(){@Override public void run(){int data = new = new random()。nextint(100); threadinger.set(data); system.out.println(thread.currentthread()+"put data:"+data); mythreadscopedata.getThreadInstance()。setName(thread.currentthread()。toString()); mythReadscopedata.getThedAta.getThedAta.getThedAta.GetThedAta.GetTheDATA.GETTHREADENTANCINESTANCE(); a()。get(); new b()。get();}}) mythreadscopedata.getThreadInstance(); system.out.println( "a from"+mythreadscopedata);}} static class b {public void get(){int data = threadinger.get(); system.out.println( "from" br "b from"+thread.currentsred( = mythreadscopedata.getThreadInstance(); system.out.println( "b from"+mythreadscopedata);}}/****}/*** singleables* singleables mode、組み込みスレッドロカルタイプ変数*/クラスmythreadscopedata {private mythreadscopedata( ThreadLocal <MythReadScopeData> data = new ThreadLocal <>(); public static mythreadscopedata getthreadinstance(){mythreadscopedata instance = data.get(); if(instance == null){instance = new mythReadScopeData 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;}}いくつかの方法
最後の方法の例:
5つのスレッドをデザインし、jの場合は3つのスレッドが毎回1倍に増加し、他の2つのスレッドはjに対して毎回減少します
パッケージcom.iot.thread;/*** 2016/2/4にブライアンによって作成されました。 */public class rebiredsharedata {private static mutisharedata mutisharedata = new mutisharedata(); public static void main(string [] args){for(int i = 0; i <3; i ++){new runnable(){@Override public void run(){system.out.out.out. out. out. out. out.currn() mutisharedata.getj()+"+to:"+mutisharedata.increment()+"}");}}) "+mutisharedata.getj()+" -to: "+mutisharedata.decrement()+"} ");}})。start();}}/** * compurate date of offctionの共有データをカプセル化します(そのオブジェクトでも操作データを操作する方法が完成します) ++ j;} public synchronized int decroment(){return -j;} public synchronized int getj(){return j;} public synchronized void setj(int j){this.j = j;}}}}上記は、Javaプログラミングマルチスレッド共有データコードのすべての詳細な説明です。すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!