ในรูปแบบการพัฒนาแบบซิงโครนัสแบบดั้งเดิม เมื่อเราเรียกใช้ฟังก์ชัน ข้อมูลจะถูกส่งผ่านพารามิเตอร์ของฟังก์ชัน และผลลัพธ์การคำนวณสุดท้ายจะถูกส่งกลับผ่านค่าที่ส่งคืนของฟังก์ชัน อย่างไรก็ตาม ในโหมดการพัฒนาแบบอะซิงโครนัสแบบมัลติเธรด การส่งและการส่งคืนข้อมูลจะแตกต่างจากโหมดการพัฒนาแบบซิงโครนัสอย่างมาก เนื่องจากการรันและการสิ้นสุดของเธรดนั้นไม่สามารถคาดเดาได้ เมื่อถ่ายโอนและส่งคืนข้อมูล ข้อมูลจะไม่สามารถส่งคืนผ่านพารามิเตอร์ฟังก์ชัน และส่งคืนคำสั่งเช่นฟังก์ชัน บทความนี้จะแนะนำวิธีการต่างๆ ในการส่งข้อมูลไปยังเธรดด้วยเหตุผลข้างต้น ในบทความถัดไป เราจะแนะนำวิธีการส่งคืนข้อมูลจากเธรด
ถ้าอยากรับก่อนก็ต้องให้ก่อน โดยทั่วไป เมื่อใช้เธรด จำเป็นต้องมีข้อมูลการเริ่มต้นบางอย่าง จากนั้นเธรดจะใช้ข้อมูลเหล่านี้เพื่อประมวลผลและส่งคืนผลลัพธ์ สิ่งแรกที่ต้องทำในกระบวนการนี้คือส่งข้อมูลไปยังเธรด
1. ส่งข้อมูลผ่านเมธอด Constructor <BR>เมื่อสร้างเธรด คุณต้องสร้างอินสแตนซ์ของคลาส Thread หรือคลาสย่อย ดังนั้นจึงไม่ใช่เรื่องยากสำหรับเราที่จะคิดถึงการส่งข้อมูลไปยังเธรดผ่านวิธีคอนสตรัคเตอร์ของคลาสเธรดก่อนที่จะเรียกใช้เมธอด start และบันทึกข้อมูลที่เข้ามาโดยใช้ตัวแปรคลาสเพื่อใช้โดยเธรด (จริง ๆ แล้วใช้ในวิธีการเรียกใช้) รหัสต่อไปนี้สาธิตวิธีการส่งข้อมูลผ่านตัวสร้าง:
คัดลอกรหัสรหัส ดังต่อไปนี้:
ตำนานแพ็คเกจ;
MyThread1 คลาสสาธารณะขยายเธรด
-
ชื่อสตริงส่วนตัว
MyThread1 สาธารณะ (ชื่อสตริง)
-
this.name = ชื่อ;
-
การรันโมฆะสาธารณะ ()
-
System.out.println("สวัสดี" + ชื่อ);
-
โมฆะสาธารณะคง main (String [] args)
-
เธรดเธรด = new MyThread1("world");
เธรด.เริ่มต้น();
-
-
เนื่องจากเมธอดนี้จะถ่ายโอนข้อมูลในขณะที่สร้างอ็อบเจ็กต์เธรด ข้อมูลจึงมีอยู่แล้วก่อนที่เธรดจะรัน ดังนั้นข้อมูลจะไม่ถูกส่งผ่านไปหลังจากเธรดรัน หากคุณต้องการส่งข้อมูลที่ซับซ้อนมากขึ้น คุณสามารถใช้โครงสร้างข้อมูล เช่น คอลเลกชันและคลาสได้ แม้ว่าการใช้วิธีคอนสตรัคเตอร์เพื่อถ่ายโอนข้อมูลจะปลอดภัยกว่า แต่จะทำให้เกิดความไม่สะดวกอย่างมากหากมีข้อมูลจำนวนมากที่ต้องถ่ายโอน เนื่องจาก Java ไม่มีพารามิเตอร์เริ่มต้น หากคุณต้องการได้รับเอฟเฟกต์ที่คล้ายกับพารามิเตอร์เริ่มต้น คุณต้องใช้การโอเวอร์โหลด ซึ่งไม่เพียงแต่ทำให้ตัวสร้างเองซับซ้อนเกินไป แต่ยังเพิ่มจำนวนตัวสร้างอย่างมากอีกด้วย ดังนั้น เพื่อหลีกเลี่ยงสถานการณ์นี้ ให้ส่งข้อมูลผ่านวิธีคลาสหรือตัวแปรคลาส
2. ส่งข้อมูลผ่านตัวแปรและวิธีการ <BR>โดยทั่วไปมีโอกาสสองครั้งในการส่งข้อมูลไปยังออบเจ็กต์ โอกาสแรกคือการส่งข้อมูลผ่านวิธีคอนสตรัคเตอร์เมื่อสร้างออบเจ็กต์ และโอกาสอื่นคือการกำหนดชุดข้อมูล ของข้อมูลในคลาส วิธีการสาธารณะหรือตัวแปร (เรียกอีกอย่างว่าฟิลด์) จากนั้นหลังจากสร้างออบเจ็กต์แล้ว ให้กำหนดค่าทีละรายการผ่านอินสแตนซ์ของออบเจ็กต์ รหัสต่อไปนี้เป็นการแก้ไขคลาส MyThread1 โดยใช้วิธี setName เพื่อตั้งค่าตัวแปรชื่อ:
คัดลอกรหัสรหัส ดังต่อไปนี้:
ตำนานแพ็คเกจ;
MyThread2 คลาสสาธารณะใช้งาน Runnable
-
ชื่อสตริงส่วนตัว
setName เป็นโมฆะสาธารณะ (ชื่อสตริง)
-
this.name = ชื่อ;
-
การรันโมฆะสาธารณะ ()
-
System.out.println("สวัสดี" + ชื่อ);
-
โมฆะสาธารณะคง main (String [] args)
-
MyThread2 myThread = ใหม่ MyThread2();
myThread.setName("โลก");
เธรดเธรด = เธรดใหม่ (myThread);
เธรด.เริ่มต้น();
-
-
3. ส่งข้อมูลผ่านฟังก์ชันการโทรกลับ <BR>สองวิธีในการส่งข้อมูลไปยังเธรดที่กล่าวถึงข้างต้นเป็นวิธีที่ใช้กันมากที่สุด แต่ทั้งสองวิธีส่งข้อมูลไปยังคลาสเธรดในวิธีการหลักอย่างแข็งขัน สำหรับเธรด ข้อมูลนี้จะได้รับแบบพาสซีฟ อย่างไรก็ตาม ในบางแอปพลิเคชัน จำเป็นต้องรับข้อมูลแบบไดนามิกในขณะที่เธรดกำลังทำงานอยู่ ตัวอย่างเช่น มีการสร้างตัวเลขสุ่มสามตัวในวิธีการรันของโค้ดต่อไปนี้ จากนั้นผลรวมของตัวเลขสุ่มทั้งสามตัวนี้จะถูกคำนวณผ่านวิธีกระบวนการ ของคลาส Work และส่งคืนผลลัพธ์ผ่านค่าของคลาส Data ดังที่เห็นได้จากตัวอย่างนี้ จะต้องได้รับตัวเลขสุ่มสามตัวก่อนที่จะส่งคืนค่า กล่าวอีกนัยหนึ่ง ค่านี้ไม่สามารถส่งผ่านไปยังคลาสเธรดล่วงหน้าได้
คัดลอกรหัสรหัส ดังต่อไปนี้:
ตำนานแพ็คเกจ;
ข้อมูลคลาส
-
ค่า int สาธารณะ = 0;
-
งานในชั้นเรียน
-
กระบวนการโมฆะสาธารณะ (ข้อมูลข้อมูล หมายเลขจำนวนเต็ม)
-
สำหรับ (int n : ตัวเลข)
-
ข้อมูล.value += n;
-
-
-
MyThread3 คลาสสาธารณะขยายเธรด
-
งานส่วนตัว
MyThread3 สาธารณะ (งาน)
-
this.work = งาน;
-
การรันโมฆะสาธารณะ ()
-
java.util.Random สุ่ม = ใหม่ java.util.Random();
ข้อมูล ข้อมูล = ข้อมูลใหม่ ();
int n1 = สุ่ม.nextInt(1,000);
int n2 = สุ่ม.nextInt(2000);
int n3 = สุ่ม.nextInt(3000);
work.process(data, n1, n2, n3); // ใช้ฟังก์ชันโทรกลับ
System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
+ String.valueOf(n3) + "=" + data.value);
-
โมฆะสาธารณะคง main (String [] args)
-
Thread thread = new MyThread3(งานใหม่());
เธรด.เริ่มต้น();
-
-
วิธีการประมวลผลในโค้ดข้างต้นเรียกว่าฟังก์ชันการโทรกลับ โดยพื้นฐานแล้ว ฟังก์ชันการโทรกลับคือฟังก์ชันเหตุการณ์ ใน Windows API ฟังก์ชันการโทรกลับมักใช้เพื่อโต้ตอบกับข้อมูลระหว่างโปรแกรมที่เรียก API ดังนั้นกระบวนการเรียกใช้ฟังก์ชันการเรียกกลับจึงเป็นกระบวนการดั้งเดิมของการทริกเกอร์เหตุการณ์ ในตัวอย่างนี้ การเรียกเมธอดกระบวนการเพื่อรับข้อมูลจะเทียบเท่ากับการทริกเกอร์เหตุการณ์ในเมธอด run