กระทู้สร้าง Java (อินเตอร์เฟสที่เรียกใช้และคลาสเธรด)
ในกรณีส่วนใหญ่เธรดถูกสร้างขึ้นโดยการสร้างอินสแตนซ์วัตถุเธรด Java กำหนดสองวิธี:
ต่อไปนี้อธิบายแต่ละวิธีในทางกลับกัน
การใช้อินเทอร์เฟซ Runnable
วิธีที่ง่ายที่สุดในการสร้างเธรดคือการสร้างคลาสที่ใช้อินเทอร์เฟซที่เรียกใช้งานได้ บทคัดย่อที่เรียกใช้เป็นหน่วยการดำเนินการรหัส คุณสามารถสร้างเธรดสำหรับแต่ละวัตถุโดยใช้อินเทอร์เฟซที่รันได้ ในการใช้งานอินเทอร์เฟซที่รันได้คลาสจะต้องใช้วิธีการ Run () อย่างง่ายเท่านั้นซึ่งประกาศดังต่อไปนี้:
การเรียกใช้โมฆะสาธารณะ ()
ในการเรียกใช้ () คุณสามารถกำหนดรหัสเพื่อสร้างเธรดใหม่ มันเป็นสิ่งสำคัญที่จะต้องเข้าใจสิ่งต่อไปนี้: วิธีการเรียกใช้ () สามารถเรียกใช้วิธีอื่นอ้างถึงคลาสอื่น ๆ และประกาศตัวแปรเช่นเธรดหลัก ความแตกต่างเพียงอย่างเดียวคือ Run () สร้างรายการการดำเนินการเธรดพร้อมกันอื่นในโปรแกรม เมื่อ Run () ส่งคืนเธรดจะสิ้นสุด
หลังจากที่คุณได้สร้างคลาสที่ใช้อินเตอร์เฟส Runnable แล้วคุณจะต้องยกตัวอย่างวัตถุของคลาสเธรดภายในคลาส คลาสเธรดกำหนดตัวสร้างหลายตัว สิ่งที่เราจะใช้มีดังนี้:
เธรด (unnable threadob, string threadname)
ในตัวสร้างนี้ Threadob เป็นอินสแตนซ์ที่ใช้คลาสอินเตอร์เฟสที่เรียกใช้ สิ่งนี้กำหนดจุดเริ่มต้นสำหรับการดำเนินการเธรด ชื่อของเธรดใหม่ถูกกำหนดโดย threadname
หลังจากสร้างเธรดใหม่มันจะไม่ทำงานจนกว่าจะมีการเรียกวิธีการเริ่มต้น () ซึ่งถูกกำหนดไว้ในคลาสเธรด โดยพื้นฐานแล้วเริ่มต้น () เรียกใช้การโทรไปเรียกใช้ () วิธีการเริ่มต้น () มีการประกาศดังนี้:
เป็นโมฆะเริ่มต้น ()
ตัวอย่างต่อไปนี้คือการสร้างเธรดใหม่และเริ่มทำงาน:
// สร้าง Thread.class NEWTHREAD ใช้งาน amewable {เธรด t; : " + t); t.start (); // เริ่มเธรด} // นี่คือจุดเริ่มต้นสำหรับเธรดที่สองโมฆะสาธารณะเรียกใช้ () {ลอง {สำหรับ (int i = 5; i> 0; - -) {System.out.println ("เธรดลูก:" + i); ออก. println ("ออกจากเธรดเด็ก");}} class ThreadDemo {โมฆะสาธารณะคง 0; i--) {system.out.println ("เธรดหลัก:" + i); );
ในตัวสร้าง NewThread วัตถุเธรดใหม่ถูกสร้างขึ้นโดยคำสั่งต่อไปนี้:
t = เธรดใหม่ (นี่ "เธรดสาธิต");
สิ่งนี้บ่งชี้ว่าในวัตถุนี้คุณต้องการให้เธรดใหม่เรียกใช้วิธีการเรียกใช้ () จากนั้นเริ่มต้น () เรียกว่าและการดำเนินการของเธรดจะเริ่มต้นด้วยวิธีการเรียกใช้ () สิ่งนี้ทำให้เธรดลูกสำหรับลูปเริ่มดำเนินการ หลังจากการโทรเริ่มต้น () ตัวสร้างใหม่จะกลับไปที่ Main () เมื่อเธรดหลักได้รับการกู้คืนมันจะมาถึงสำหรับลูป สองเธรดยังคงทำงานต่อไปแบ่งปัน CPU จนกว่าลูปจะสิ้นสุดลง ผลลัพธ์ของโปรแกรมนี้มีดังนี้:
เธรดลูก: เธรด [เธรดการสาธิต, 5, หลัก] เธรดหลัก: 5Child เธรด: 5Child เธรด: 4Main เธรด: 4Child เธรด: 3child เธรด: 2Main เธรด: 3Child Thread: 1E XITING THREID .
ดังที่ได้กล่าวไว้ก่อนหน้านี้ในโปรแกรมมัลติเธรดเธรดหลักมักจะต้องเป็นเธรดสุดท้ายที่สิ้นสุดการทำงาน ในความเป็นจริงสำหรับ JVM แบบเก่า ๆ หากเธรดหลักสิ้นสุดลงก่อนที่จะมีเธรดลูกระบบรันไทม์ Java อาจ "แขวน" โปรแกรมดังกล่าวช่วยให้มั่นใจได้ว่าเธรดหลักจะสิ้นสุดลงในที่สุดเนื่องจากเธรดหลักจะนอนหลับ 1,000 มิลลิวินาทีในขณะที่ด้ายเด็กมีเพียง 500 มิลลิวินาที สิ่งนี้ทำให้เธรดลูกสิ้นสุดก่อนที่เธรดหลักจะสิ้นสุดลง ในระยะสั้นคุณจะเห็นวิธีที่ดีกว่าในการรอให้เธรดจบลง
ด้ายขยาย
อีกวิธีหนึ่งในการสร้างเธรดคือการสร้างคลาสใหม่ที่ขยายคลาสเธรดจากนั้นสร้างอินสแตนซ์ของคลาสนั้น เมื่อคลาสสืบทอดเธรดจะต้องใช้วิธีการเรียกใช้ () มากเกินไปซึ่งเป็นรายการไปยังเธรดใหม่ นอกจากนี้ยังต้องเรียกวิธีการเริ่มต้น () เพื่อเริ่มต้นการดำเนินการเธรดใหม่ ต่อไปนี้คือการเขียนโปรแกรมก่อนหน้าด้วยคลาสเธรดขยาย:
// สร้างเธรดที่สองโดยขยาย ThreadClass NewThread ขยายเธรด {newThread () {// สร้างเธรดที่สอง Super ("Demo Thread"); (); ("เธรดเด็ก:" + i); ");}} คลาส ExtionThread {โมฆะคงที่สาธารณะหลัก (สตริง args []) {newThread (); // สร้างเธรดใหม่ลอง {สำหรับ (int i = 5; i> 0; i--) {ระบบ Out ::::::::::::::::::::::::::::::::::::::::::: หัวเครื่อง เธรดหลักถูกขัดจังหวะ ");} system.ou t.println (" ออกจากเธรดหลัก ");}}
โปรแกรมนี้สร้างผลลัพธ์เดียวกันกับเวอร์ชันก่อนหน้า เธรดลูกถูกสร้างขึ้นโดยวัตถุ NewThread ที่สร้างอินสแตนซ์ซึ่งได้มาจากคลาสเธรด หมายเหตุการโทรไปยัง super () ใน newthread วิธีนี้เรียกตัวสร้างเธรดของแบบฟอร์มต่อไปนี้:
เธรดสาธารณะ (String ThreadName)
ที่นี่ threadname ระบุชื่อเธรด
เลือกวิธีที่เหมาะสม
ณ จุดนี้คุณจะสงสัยอย่างแน่นอนว่าทำไม Java มีสองวิธีในการสร้างเธรดเด็กซึ่งดีกว่า คำถามทั้งหมดมีสาเหตุมาจากจุดหนึ่ง คลาสเธรดกำหนดวิธีการที่หลากหลายที่สามารถใช้งานได้มากเกินไปโดยคลาสที่ได้รับ สำหรับวิธีการทั้งหมดสิ่งเดียวที่ต้องใช้มากเกินไปคือวิธีการเรียกใช้ () แน่นอนว่าวิธีการเดียวกันที่จำเป็นในการใช้อินเทอร์เฟซที่ทำงานได้ โปรแกรมเมอร์ Java หลายคนเชื่อว่าควรขยายชั้นเรียนเฉพาะเมื่อพวกเขามีความเข้มแข็งหรือปรับเปลี่ยน ดังนั้นหากคุณไม่โอเวอร์โหลดวิธีการอื่นของเธรดอื่น ๆ จะเป็นการดีที่สุดที่จะใช้อินเตอร์เฟสที่เรียกใช้ได้เท่านั้น แน่นอนว่ามันขึ้นอยู่กับคุณที่จะตัดสินใจ อย่างไรก็ตามในส่วนอื่น ๆ ของบทนี้เราใช้คลาสที่ใช้อินเทอร์เฟซที่ใช้งานได้เพื่อสร้างเธรด