บทความนี้ส่วนใหญ่สรุปความรู้ที่เกี่ยวข้องของข้อมูลการแบ่งปันเธรดซึ่งส่วนใหญ่มีสองด้าน: หนึ่งคือวิธีการแบ่งปันข้อมูลภายในเธรดที่แน่นอนเพื่อให้แน่ใจว่าข้อมูลของแต่ละเธรดไม่ได้ตัดกัน อีกอย่างคือวิธีการแบ่งปันข้อมูลระหว่างหลายเธรดเพื่อให้แน่ใจว่ามีความสอดคล้องของข้อมูล
หากคุณใช้งานด้วยตัวเองคุณจะกำหนดแผนที่เธรดคือคีย์และข้อมูลคือค่า แต่ละรายการในตารางคือข้อมูลที่เตรียมไว้สำหรับแต่ละเธรดเพื่อให้ข้อมูลสอดคล้องกันในเธรดเดียว
ตัวอย่าง
แพ็คเกจ com.iot.thread; นำเข้า java.util.hashmap; นำเข้า java.util.map; นำเข้า java.util.random;/*** สร้างโดย Brian เมื่อปี 2016/2/4 */คลาสสาธารณะ Threadscopesharedata {// เตรียมตารางแฮชเพื่อเตรียมข้อมูลสำหรับแต่ละเธรดแต่ละแผนที่คงที่ <เธรด, จำนวนเต็ม> threaddata = hashmap ใหม่ <> (); โมฆะคงที่สาธารณะ (สตริง [] args) {สำหรับ (int i = 0; i <2; i ++) {ใหม่ สุ่ม (). nextint (); threaddata.put (thread.currentthread (), data); system.out.println (thread.currentthread ()+"ใส่ข้อมูล:"+data); ใหม่ a (). get (); ใหม่ b () threaddata.get (thread.currentthread ()); system.out.println ("a จาก"+thread.currentthread ()+"รับข้อมูล"+data);}} คลาสคงที่ b {โมฆะสาธารณะ get (int data = threadData.get (thread.currentthread () "+data);}}}รหัสข้างต้นรายงานข้อยกเว้นเป็นครั้งคราว:
ข้อยกเว้นในเธรด "thread-0" java.lang.nullpointerexception
ที่ com.iot.thread.threadscopesharedata $ a.get (threadscopesharedata.java:29)
ที่ 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; นำเข้า java.util.random;/*** สร้างโดย Brian เมื่อปี 2016/2/4 */คลาสสาธารณะ ThreadLocalTest {ส่วนตัวคงที่ threadlocal <integer> threadinger = new ThreadLocal <> (); โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สำหรับ (int i = 0; i <2; i ++) {เธรดใหม่ สุ่ม (). NextInt (100); threadinger.set (data); system.out.println (thread.currentthread ()+"ใส่ข้อมูล:"+data); mythreadscopedata.getThreadInstance () setName (thread.currentthread a (). get (); ใหม่ b (). get ();}}). start ();}} คลาสคงที่ A {โมฆะสาธารณะ get () {int data = threadinger.get (); system.out.println ("A จาก" mythreadscopedata.getThreadInstance (); system.out.println ("a จาก"+mythreadscopedata);}} คลาสคงที่ b {โมฆะสาธารณะ get () {int data = threadinger.get (); = mythreadscopedata.getThreadInstance (); system.out.println ("b จาก"+mythreadscopedata);}}}/*** คลาสข้อมูลห่อหุ้มหลายตัวแปร* โหมดสแตรดสเตีย threadlocal <mythreadscopedata> data = new ThreadLocal <> (); public Static mythreadscopedata getThreadInstance () {mythreadscopedata อินสแตนซ์ = data.get (); ถ้า (อินสแตนซ์ == null) {อินสแตนซ์ = ใหม่ {return name;} public void setName (ชื่อสตริง) {this.name = name;} public int getage () {return age;} public void setage (อายุ int) {this.age = age;}@override public String toString () super.toString ()+"-{ชื่อ, อายุ}"+": {"+getName ()+","+getage ()+"}"; return reval;}}}มีหลายวิธี
ตัวอย่างของวิธีสุดท้าย:
ออกแบบ 5 เธรดสามเธรดเพิ่มขึ้น 1 ครั้งในแต่ละครั้งสำหรับ J และอีกสองเธรดลดลง 1 ในแต่ละครั้งสำหรับ J
แพ็คเกจ com.iot.Thread;/*** สร้างโดย Brian ในปี 2016/2/4 */คลาสสาธารณะ mutithreadsharedata {ส่วนตัวคงที่ mutisharedata mutisharedata = new mutisharedata (); โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สำหรับ (int i = 0; i <3; i ++) {เธรดใหม่ Mutisharedata.getj ()+"+to:"+mutisharedata.increment ()+"}");}}). start ();} สำหรับ (int i = 0; i <2; i ++) {เธรดใหม่ "+mutisharedata.getj ()+" - ถึง: "+mutisharedata.decrement ()+"} ");}}) เริ่มต้น ();}}}/** * ห่อหุ้มข้อมูลที่แชร์ในวัตถุอื่น ซิงโครไนซ์ int decrement () {return --j;} public synchronized int getj () {return j;} public synchronized void setj (int j) {this.j = j;}}ข้างต้นเป็นคำอธิบายโดยละเอียดทั้งหมดของรหัสข้อมูลที่ใช้ร่วมกันหลายเธรดฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!