Artikel ini terutama merangkum pengetahuan yang relevan dari data berbagi utas, yang terutama mencakup dua aspek: satu adalah bagaimana berbagi data dalam utas tertentu untuk memastikan bahwa data masing -masing utas tidak berpotongan; Yang lainnya adalah bagaimana berbagi data antara beberapa utas untuk memastikan konsistensi data.
Jika Anda menerapkannya sendiri, Anda menentukan peta, utasnya adalah kuncinya dan datanya adalah nilainya. Setiap item dalam tabel adalah data yang disiapkan untuk setiap utas, sehingga data konsisten dalam satu utas.
contoh
Paket com.iot.thread; import java.util.hashmap; import java.util.map; import java.util.random;/*** dibuat oleh Brian pada 2016/2/4. */kelas publik ThreadScoPesharedata {// Siapkan tabel hash untuk menyiapkan data untuk setiap utas peta statis pribadi <thread, integer> threadData = hashmap baru <> (); public static void main (string [] args) {for (int i = 0; i <2; i ++ Acak (). NextInt (); threadData.put (thread.currentThread (), data); System.out.println (thread.currentThread ()+"letakkan data:"+data); baru a (). Get (); baru b (). Get ();}}). Start ();}} static class {). 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);}}}Kode di atas kadang -kadang melaporkan pengecualian:
Pengecualian di Thread "Thread-0" java.lang.nullpointerException
di com.iot.thread.threadscopesharedata $ a.get (threadscopesharedata.java:29)
di com.iot.thread.threadscopesharedata $ 1.run (threadscoPesharedata.java:21)
di java.lang.thread.run (thread.java:745)
Saya belum tahu alasan spesifik
API:
java.lang: class threadlocal <t>
Gunakan objek ThreadLocal sebagai gantinya peta di atas
Tentukan objek untuk merangkum beberapa variabel dan kemudian simpan seluruh objek di ThreadLocal
Saat multivariat, yang terbaik adalah menempatkan kelas threadlocal di dalam kelas data. Kelas data mengadopsi mode singleton, sehingga akan lebih nyaman untuk membuat objek baru dan mendapatkan objek, dan pada saat yang sama lebih merupakan enkapsulasi.
Paket com.iot.thread; import java.util.random;/*** Dibuat oleh Brian pada 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 () {) {new thread (new runnable () {@override public void run () {) {new thread (new runnable () {@override public void run () {) {new road = Acak (). NextInt (100); threadinger.set (data); System.out.println (thread.currentThread ()+"Letakkan data:"+data); mythreadscopedata.getThreadInstance (). Setname (thread.currentthread (). Tostring ()); mythreadscopedata.currentthread (). Tostring ()); mythreadscopedata.currentthread (). Tostring ()); mythreadscopedata.currentthread (). Tostring ()); mythreadscopedata.currentanchread (). Tostring ()); mythreadscopedata. 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 dari"+mythreadscopedata);}}}/*** Kelas data merangkum multivariabel private {private {private {private {private {private mythreadscoped {private mythreadscoped {mytreadata {private My {private mythreadscoped ThreadLocal <mythreadscopedata> data = threadlocal baru <> (); public static mythreadscopedata getThreadInstance () {myThreadscopedata instance = data.get (); if (instance == null) {instance = new mythreadscopedata (); data. {return name;} public void setName (name string) {this.name = name;} public int getage () {return usia;} public void setage (int usia) {this.age = usia;}@override public string toString () {string reval = super.toString ()+"-{name, usia}"+": {"+getName ()+","+getage ()+"}"; return reval;}}Beberapa cara
Contoh metode terakhir:
Desain 5 utas, tiga utas meningkat sebesar 1 setiap kali untuk J, dan dua utas lainnya berkurang 1 setiap kali untuk j
Paket com.iot.thread;/*** Dibuat oleh Brian pada 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 Thread( new Runnable() {@Override public void run() {System.out.println(Thread.currentThread()+":{j from "+mutisharedata.getj ()+"+to: "+mutisharedata.increment ()+"} ");}}). start ();} for (int i = 0; i <2; i ++) {thread baru (runnable baru () {@Override public void run () {System. "+mutisharedata.getj ()+" - to: "+mutisharedata.decrement ()+"} ");}}). start ();}}/** * merangkum data yang dibagikan dalam objek lain (metode pengembalian publical juga diselesaikan dalam objek itu) */class mutisharedata {return {private {publicing Juma; ++ j;} Decrement int sinkronisasi publik () {return --j;} publik sinkronisasi int getj () {return j;} public disinkronkan void setj (int j) {this.j = j;}}Di atas adalah semua penjelasan terperinci dari pemrograman java kode data bersama multi-threaded, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!