ใน Java มีสองวิธีในการสร้างเธรดการทำงานใหม่:
- สืบทอดจากคลาส Thread - ประกาศคลาสเป็น subclass ของ Thread และ override เมธอด run()
- นำอินเทอร์เฟซ Runnable ไปใช้งาน - ประกาศคลาสที่ implements Runnable และ implement เมธอด run() จากนั้นสร้างอินสแตนซ์และส่งให้ Thread constructor
ทุกเธรดมีชื่อเพื่อการระบุตัวตน อาจมีหลายเธรดที่ใช้ชื่อเดียวกันได้ หากไม่ระบุชื่อเมื่อสร้างเธรด ระบบจะสร้างชื่อใหม่ให้โดยอัตโนมัติ
ตารางเปรียบเทียบรายละเอียด
| ลำดับ | หัวข้อ | Thread | Runnable |
|---|---|---|---|
| 1 | พื้นฐาน | Thread เป็นคลาส ใช้สร้างเธรด | Runnable เป็น functional interface ใช้สร้างเธรด |
| 2 | เมธอด | มีหลายเมธอด รวมถึง start() และ run() | มีเพียงเมธอด abstract run() เท่านั้น |
| 3 | อ็อบเจ็กต์ | แต่ละเธรดสร้างอ็อบเจ็กต์ที่ไม่ซ้ำกันและเชื่อมโยงกับมัน | หลายเธรดสามารถใช้ร่วมอ็อบเจ็กต์เดียวกันได้ |
| 4 | หน่วยความจำ | ต้องการหน่วยความจำมากกว่า | ต้องการหน่วยความจำน้อยกว่า |
| 5 | ข้อจำกัด | Java ไม่รองรับ multiple inheritance ดังนั้นคลาสที่ extends Thread แล้วไม่สามารถ extends คลาสอื่นได้ | ถ้าคลาส implements Runnable แล้ว ยังสามารถ extends คลาสอื่นได้ |
ตัวอย่าง Runnable
class RunnableExample implements Runnable {
public void run() {
System.out.println("Thread is running for Runnable Implementation");
}
public static void main(String args[]) {
RunnableExample runnable = new RunnableExample();
Thread t1 = new Thread(runnable);
t1.start();
}
}
ตัวอย่าง Thread
class ThreadExample extends Thread {
public void run() {
System.out.println("Thread is running");
}
public static void main(String args[]) {
ThreadExample t1 = new ThreadExample();
t1.start();
}
}
สรุป
Runnable เป็นวิธีที่แนะนำมากกว่า (preferred) เนื่องจากยืดหยุ่นกว่า ประหยัดหน่วยความจำ และไม่ขัดขวางการสืบทอดคลาสอื่น ในขณะที่ Thread เหมาะสำหรับกรณีง่ายๆ ที่ไม่ต้องการสืบทอดเพิ่มเติม