มีสองวิธีในการสร้างเธรดใน Java: การใช้คลาส Thread และการใช้อินเทอร์เฟซ Runnable เมื่อใช้อินเทอร์เฟซ Runnable คุณจะต้องสร้างอินสแตนซ์ Thread ดังนั้น ไม่ว่าคุณจะสร้างเธรดผ่านคลาส Thread หรืออินเทอร์เฟซ Runnable คุณต้องสร้างอินสแตนซ์ของคลาส Thread หรือคลาสย่อย ตัวสร้างของคลาสเธรดมีการโอเวอร์โหลดแปดครั้ง ตัวสร้างมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
กระทู้สาธารณะ ( );
เธรดสาธารณะ (เป้าหมายที่รันได้);
เธรดสาธารณะ (ชื่อสตริง);
เธรดสาธารณะ (เป้าหมายที่รันได้, ชื่อสตริง);
เธรดสาธารณะ (กลุ่ม ThreadGroup, เป้าหมายที่รันได้);
เธรดสาธารณะ (กลุ่มเธรดกรุ๊ป ชื่อสตริง);
เธรดสาธารณะ (กลุ่ม ThreadGroup, เป้าหมายที่รันได้, ชื่อสตริง);
เธรดสาธารณะ (กลุ่ม ThreadGroup, เป้าหมายที่รันได้, ชื่อสตริง, stackSize แบบยาว);
เป้าหมายที่รันได้
อินสแตนซ์ของคลาสที่ใช้อินเทอร์เฟซ Runnable ควรสังเกตว่าคลาส Thread ยังใช้อินเทอร์เฟซ Runnable ดังนั้นอินสแตนซ์ของคลาสที่สืบทอดมาจากคลาส Thread ยังสามารถส่งผ่านไปยังตัวสร้างนี้เป็นเป้าหมายได้
ชื่อสตริง
ชื่อของเธรด ชื่อนี้สามารถตั้งค่าผ่านเมธอด setName ของคลาส Thread หลังจากสร้างอินสแตนซ์ Thread หากไม่ได้ตั้งชื่อเธรด เธรดจะใช้ชื่อเธรดเริ่มต้น: Thread-N N คือลำดับที่สร้างเธรดและเป็นจำนวนเต็มบวกที่ไม่ซ้ำกัน
กลุ่มเธรดกรุ๊ป
กลุ่มเธรดที่มีเธรดที่สร้างขึ้นในปัจจุบันอยู่ หากไม่มีการระบุกลุ่มเธรด เธรดทั้งหมดจะถูกเพิ่มในกลุ่มเธรดเริ่มต้น รายละเอียดเกี่ยวกับกลุ่มเธรดจะมีการกล่าวถึงโดยละเอียดในบทต่อๆ ไป
ขนาดกองยาว
ขนาดของเธรดสแต็ก โดยทั่วไปค่านี้จะเป็นจำนวนเต็มของเพจ CPU ตัวอย่างเช่น ขนาดหน้า x86 คือ 4KB ภายใต้แพลตฟอร์ม x86 ขนาดสแต็กเธรดเริ่มต้นคือ 12KB
คลาส Java ธรรมดาสามารถกลายเป็นคลาสเธรดได้ตราบใดที่สืบทอดมาจากคลาส Thread และโค้ดเธรดสามารถดำเนินการได้ด้วยวิธี start ของคลาส Thread แม้ว่าคลาสย่อยของคลาส Thread สามารถสร้างอินสแตนซ์ได้โดยตรง แต่วิธีการรันของคลาส Thread จะต้องถูกแทนที่ในคลาสย่อยเพื่อรันโค้ดของเธรดจริง ๆ รหัสต่อไปนี้เป็นตัวอย่างของการใช้คลาส Thread เพื่อสร้างเธรด:
คัดลอกรหัสรหัสดังต่อไปนี้:
ตำนานแพ็คเกจ;
Thread1 คลาสสาธารณะขยายเธรด
-
การรันโมฆะสาธารณะ ()
-
System.out.println(this.getName());
-
โมฆะสาธารณะคง main (String [] args)
-
System.out.println(Thread.currentThread().getName());
Thread1 thread1 = Thread1 ใหม่ ();
Thread1 thread2 = Thread1 ใหม่ ();
thread1.start();
thread2.start();
-
-
โค้ดด้านบนสร้างสองเธรด: thread1 และ thread2 บรรทัด 005 ถึง 005 ในโค้ดด้านบนเป็นวิธีการรันของคลาส Thread1 เมื่อเรียกใช้เมธอด start บนบรรทัด 014 และ 015 ระบบจะเรียกเมธอด run โดยอัตโนมัติ ในบรรทัด 007 this.getName() ใช้เพื่อเอาต์พุตชื่อของเธรดปัจจุบัน เนื่องจากไม่ได้ระบุชื่อเธรดเมื่อสร้างเธรด เอาต์พุตชื่อเธรดจึงเป็นค่าเริ่มต้นของระบบ ซึ่งอยู่ในรูปของ Thread -n. ชื่อเธรดของเธรดหลักจะเอาต์พุตอยู่ที่บรรทัด 011
ผลลัพธ์ของการรันโค้ดข้างต้นมีดังนี้:
หลัก
เธรด-0
เธรด-1
ดังที่เห็นได้จากเอาต์พุตด้านบน เอาต์พุตหลักในบรรทัดแรกคือชื่อของเธรดหลัก Thread-1 และ Thread-2 ต่อไปนี้เป็นผลลัพธ์เอาต์พุตของ thread1 และ thread2 ตามลำดับ
หมายเหตุ: โปรแกรม Java ใดๆ จะต้องมีเธรดหลัก โดยทั่วไปแล้ว ชื่อของเธรดหลักนี้คือชื่อเธรดหลัก เฉพาะการสร้างเธรดเพิ่มเติมในโปรแกรมเท่านั้นจึงจะถือเป็นโปรแกรมแบบมัลติเธรดที่แท้จริง กล่าวอีกนัยหนึ่ง โปรแกรมแบบมัลติเธรดจะต้องมีมากกว่าหนึ่งเธรด
คลาสเธรดมีตัวสร้างที่โอเวอร์โหลดเพื่อตั้งชื่อเธรด นอกเหนือจากการใช้เมธอด Constructor เพื่อตั้งชื่อเธรดเมื่อสร้างเธรด คุณยังสามารถใช้เมธอด setName ของคลาส Thread เพื่อแก้ไขชื่อเธรดได้ เมื่อต้องการตั้งชื่อเธรดผ่านตัวสร้างของคลาสเธรด คุณต้องใช้ตัวสร้างเธรดสาธารณะ (ชื่อสตริง) ของคลาสเธรดในคลาสย่อยของเธรด ดังนั้น คุณต้องเพิ่มเธรดสำหรับส่งผ่านในคลาสย่อยของเธรดด้วย ตัวสร้างชื่อ รหัสต่อไปนี้เป็นตัวอย่างของการตั้งชื่อเธรด:
คัดลอกรหัสรหัสดังต่อไปนี้:
ตำนานแพ็คเกจ;
Thread2 คลาสสาธารณะขยายเธรด
-
สตริงส่วนตัวใคร;
การรันโมฆะสาธารณะ ()
-
System.out.println(ใคร + /// + this.getName());
-
Thread2 สาธารณะ (สตริงใคร)
-
ซุปเปอร์();
นี่ใคร = ใคร;
-
Thread2 สาธารณะ (สตริงที่ชื่อสตริง)
-
ซุปเปอร์(ชื่อ);
นี่ใคร = ใคร;
-
โมฆะสาธารณะคง main (String [] args)
-
Thread2 thread1 = Thread2 ใหม่ ("thread1", "MyThread1");
Thread2 thread2 = Thread2 ใหม่ ("thread2");
Thread2 thread3 = Thread2 ใหม่ ("thread3");
thread2.setName("MyThread2");
thread1.start();
thread2.start();
thread3.start();
-
มีตัวสร้างสองตัวในคลาส:
บรรทัด 011: ตัวอย่างสาธารณะ2_2(สตริงใคร)
ตัวสร้างนี้มีพารามิเตอร์เดียว: ใคร พารามิเตอร์นี้ใช้เพื่อระบุเธรดที่สร้างขึ้นในปัจจุบัน ตัวสร้างเริ่มต้นของ Thread สาธารณะ Thread() ยังคงถูกเรียกในตัวสร้างนี้
บรรทัด 016: ตัวอย่างสาธารณะ2_2 (สตริงใคร ชื่อสตริง)
who ในตัวสร้างนี้มีความหมายเหมือนกับ who ในตัวสร้างตัวแรก และพารามิเตอร์ name คือชื่อของเธรด ในตัวสร้างนี้ ตัวสร้างเธรดสาธารณะ (ชื่อสตริง) ของคลาสเธรดถูกเรียก ซึ่งก็คือ super(name) ในบรรทัด 018
มีการสร้างเธรดสามเธรดในวิธีการหลัก: thread1, thread2 และ thread3 ในหมู่พวกเขา thread1 ตั้งชื่อเธรดผ่านวิธีการก่อสร้าง thread2 แก้ไขชื่อเธรดผ่านวิธี setName และ thread3 ไม่ได้ตั้งชื่อเธรด
ผลการวิ่งมีดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
thread1:MyThread1
thread2:MyThread2
เธรด 3: เธรด-1
ดังที่เห็นได้จากผลลัพธ์ด้านบน ชื่อเธรดของ thread1 และ thread2 ได้รับการแก้ไข ในขณะที่ชื่อเธรดของ thread3 ยังคงเป็นค่าเริ่มต้น: Thread-1 สาเหตุที่ชื่อเธรดของ thread3 ไม่ใช่ Thread-2 แต่เป็น Thread-1 เนื่องจากชื่อของ thread2 ได้รับการระบุไว้ในบรรทัด 026 ดังนั้น เมื่อ thread3 เริ่มทำงาน ชื่อเธรดของ thread3 จะถูกตั้งค่าเป็น Thread-1 ดังนั้นคุณจะได้ผลลัพธ์ข้างต้น
หมายเหตุ: คุณสามารถใช้ setName เพื่อตั้งชื่อเธรดก่อนและหลังการเรียกเมธอด start อย่างไรก็ตาม การใช้ setName เพื่อแก้ไขชื่อเธรดหลังจากการเรียกเมธอด start จะทำให้เกิดความไม่แน่นอน ซึ่งหมายความว่า setName อาจไม่ถูกดำเนินการจนกว่าเมธอด run จะถูกดำเนินการ ดำเนินการ หากคุณต้องการใช้ชื่อเธรดในวิธีการเรียกใช้ จะมีปรากฏการณ์ที่แม้ว่าจะเรียกวิธีการ setName แต่ชื่อเธรดจะไม่ถูกแก้ไข
ไม่สามารถเรียกเมธอด start ของคลาส Thread ได้หลายครั้ง ตัวอย่างเช่น เมธอด thread1.start() ไม่สามารถเรียกได้สองครั้ง มิฉะนั้น IllegalThreadStateException จะถูกส่งออกไป