มีสองวิธีในการสร้างเธรดใน Java: การใช้คลาส Thread และการใช้อินเทอร์เฟซ Runnable เมื่อใช้อินเทอร์เฟซ Runnable คุณจะต้องสร้างอินสแตนซ์ Thread ดังนั้น ไม่ว่าคุณจะสร้างเธรดผ่านคลาส Thread หรืออินเทอร์เฟซ Runnable คุณต้องสร้างอินสแตนซ์ของคลาส Thread หรือคลาสย่อย ตัวสร้างของคลาสเธรดมีการโอเวอร์โหลดแปดครั้ง ตัวสร้างมีดังนี้:
อินสแตนซ์ของคลาสที่ใช้อินเทอร์เฟซ 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();
-
-
ผลลัพธ์ของการรันโค้ดข้างต้นมีดังนี้:
หมายเหตุ: โปรแกรม 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 คือชื่อของเธรด ในตัวสร้างนี้ ตัวสร้างเธรดสาธารณะ (ชื่อสตริง) ของคลาสเธรดถูกเรียก ซึ่งก็คือซุปเปอร์ (ชื่อ) ในบรรทัด 018
มีการสร้างเธรดสามรายการในวิธีการหลัก: thread1, thread2 และ thread3 ในหมู่พวกเขา thread1 ตั้งชื่อเธรดผ่านวิธีการก่อสร้าง thread2 แก้ไขชื่อเธรดผ่านวิธี setName และ thread3 ไม่ได้ตั้งชื่อเธรด
ผลการวิ่งมีดังนี้:
หมายเหตุ: คุณสามารถใช้ setName เพื่อตั้งชื่อเธรดก่อนและหลังการเรียกเมธอด start อย่างไรก็ตาม การใช้ setName เพื่อแก้ไขชื่อเธรดหลังจากการเรียกเมธอด start จะทำให้เกิดความไม่แน่นอน ซึ่งหมายความว่า setName อาจไม่ถูกดำเนินการจนกว่าเมธอด run จะถูกดำเนินการ ดำเนินการแล้ว หากคุณต้องการใช้ชื่อเธรดในวิธีการ run จะมีปรากฏการณ์ที่แม้ว่าจะเรียกวิธีการ setName แต่ชื่อเธรดจะไม่ถูกแก้ไข
ไม่สามารถเรียกเมธอด start ของคลาส Thread ได้หลายครั้ง ตัวอย่างเช่น เมธอด thread1.start() ไม่สามารถเรียกได้สองครั้ง มิฉะนั้น IllegalThreadStateException จะถูกส่งออกไป