แนะนำ, 2024

ตัวเลือกของบรรณาธิการ

ความแตกต่างระหว่าง Thread Class และ Runnable Interface ใน Java

สามารถกำหนดเธรดได้สองวิธี ก่อนอื่นด้วยการ ขยายคลาสของเธรด ที่ใช้อินเทอร์เฟซที่เรียกใช้แล้ว ประการที่สองโดย ใช้อินเตอร์เฟซที่เรียกใช้ โดยตรง เมื่อคุณกำหนดเธรดโดยการขยายคลาสของเธรดคุณจะต้องแทนที่เมธอด run () ในคลาสของเธรด เมื่อคุณกำหนดเธรดที่ใช้อินเตอร์เฟส Runnable คุณจะต้องใช้เมธอด run () ของอินเตอร์เฟส Runnable เท่านั้น ความแตกต่างพื้นฐานระหว่างเธรดและ Runnable คือแต่ละเธรดที่กำหนดโดยการขยายคลาสของเธรดสร้างวัตถุที่ไม่ซ้ำกันและเชื่อมโยงกับวัตถุนั้น แต่ละเธรดที่กำหนดโดยการนำอินเตอร์เฟส Runnable ไปใช้วัตถุเดียวกันร่วมกัน

ให้เราสังเกตความแตกต่างอื่น ๆ ระหว่างเธรดและเรียกใช้ด้วยความช่วยเหลือของแผนภูมิเปรียบเทียบที่แสดงด้านล่าง:

แผนภูมิเปรียบเทียบ

พื้นฐานสำหรับการเปรียบเทียบด้ายRunnable
ขั้นพื้นฐานแต่ละเธรดสร้างวัตถุที่ไม่ซ้ำกันและเชื่อมโยงกับมันหลายเธรดใช้วัตถุเดียวกันร่วมกัน
หน่วยความจำเมื่อแต่ละเธรดสร้างวัตถุที่ไม่ซ้ำกันจำเป็นต้องใช้หน่วยความจำเพิ่มเติมเนื่องจากมีหลายเธรดที่แชร์วัตถุเดียวกันจะใช้หน่วยความจำน้อยกว่า
ขยายใน Java ไม่อนุญาตให้สืบทอดหลายรายการหลังจากคลาสขยายเธรดคลาสแล้วจะไม่สามารถขยายคลาสอื่นได้หากคลาสกำหนดเธรดที่ใช้อินเตอร์เฟส Runnable จะมีโอกาสขยายคลาสหนึ่ง
ใช้ผู้ใช้ต้องขยายคลาสเธรดเท่านั้นหากต้องการแทนที่เมธอดอื่นในคลาสเธรดหากคุณต้องการเฉพาะวิธีการทดสอบที่เชี่ยวชาญเท่านั้นการใช้ Runnable เป็นตัวเลือกที่ดีกว่า
การแต่งงานกันการขยายคลาสของเธรดจะแนะนำการมีเพศสัมพันธ์อย่างแน่นหนาเนื่องจากคลาสนั้นมีรหัสของคลาสของเธรดและยังมีงานที่กำหนดให้กับเธรดการนำอินเตอร์เฟส Runnable มาใช้จะแนะนำการเชื่อมต่อแบบหลวมเนื่องจากรหัสของเธรดจะแยกจากงานของเธรด

คำจำกัดความของคลาสเธรด

Thread เป็นคลาสในแพ็คเกจ java.lang คลาสเธรดขยายคลาสของ วัตถุ และใช้อินเทอร์เฟซ Runnable คลาส Thread มีตัวสร้างและวิธีการในการสร้างและดำเนินการกับเธรด เมื่อเราสร้างหลายเธรดแต่ละเธรดจะสร้างวัตถุที่ไม่ซ้ำกันและเชื่อมโยงกับวัตถุนั้น หากคุณสร้างเธรดที่ขยายคลาสของเธรดคุณจะไม่สามารถขยายคลาสอื่นได้เนื่องจาก java ไม่รองรับการสืบทอดหลายรายการ ดังนั้นคุณควรเลือกที่จะขยายคลาสเธรดเฉพาะเมื่อคุณต้องการแทนที่เมธอดอื่น ๆ ของคลาสเธรดด้วย ให้เราดูตัวอย่างของการสร้างเธรดที่ขยายคลาสเธรด

 / * การกำหนดเธรด * / คลาส Mythread จะขยายเธรด {/ * ของงานเธรด * / โมฆะสาธารณะที่ทำงาน () {สำหรับ (int i = 0; i <10; i ++ 10) {System.Out.Println ("เธรดย่อย" ); }} คลาส mainThread {/ * งานของเธรดหลัก * / โมฆะสแตติกสาธารณะหลัก (String args []) {Mythread mt = new Mythread (); / * เธรดหลักสร้างเธรดลูก * / mt.start (); สำหรับ (int i = 0; i <10; i ++) {System.Out.Print ("เธรดหลัก"); }}} / * เอาต์พุต * / เธรดหลักเธรดหลักเธรดหลักเธรดเธรดเธรดเด็กเธรดเธรดเธรดเธรดเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธอาคารเธซเธซเธซเธเธ 

ในรหัสด้านบนฉันสร้างคลาส Mythread ที่ขยายคลาส Thread และแทนที่เมธอด run ของคลาส Thread ในชั้นเรียนที่มีวิธีการหลักฉันสร้างวัตถุเธรด (mt) ของคลาส Mythread และการใช้วัตถุเธรดที่เรียกใช้วิธีการเริ่มต้น () เมธอด start เริ่มต้นการเรียกใช้งานเธรดและในเวลาเดียวกัน JVM จะเรียกใช้เมธอด run ของเธรด ขณะนี้มีสองเธรดในโปรแกรมหนึ่งเธรดหลักและเธรดรองที่สร้างโดยเธรดหลัก การดำเนินการของเธรดทั้งสองเกิดขึ้นพร้อมกัน แต่เอาต์พุตที่แน่นอนไม่สามารถทำท่าได้

นิยามของ Runnable Interface

Runnable เป็นอินเตอร์เฟสในแพ็คเกจ java.lang การใช้อินเตอร์เฟสที่เรียกใช้งานได้นั้นเราสามารถกำหนดเธรดได้ ส่วนต่อประสานที่ รัน ได้มีวิธีการเดียว รัน () ซึ่งนำมาใช้โดยคลาสที่ใช้ส่วนต่อประสาน Runnable เมื่อคุณเลือกที่จะกำหนดเธรดที่ใช้งานอินเตอร์เฟสที่เรียกใช้ได้คุณยังคงมีตัวเลือกในการขยายคลาสอื่น ๆ เมื่อคุณสร้างหลายเธรดโดยใช้อินเตอร์เฟสที่รันได้แต่ละเธรดจะแบ่งใช้อินสแตนซ์ที่รันได้แบบเดียวกัน ให้เราเรียนรู้วิธีกำหนดเธรดโดยใช้ส่วนต่อประสานที่รันได้

 / * การกำหนดเธรด * / คลาส Runnablethread ใช้งาน Runnable {/ * ของเธรด * / public void run () {สำหรับ (int i = 0; i <10; i ++ 10) {System.Out.Println ("เธรดรอง" ); }} คลาส mainThread {/ * งานของเธรดหลัก * / โมฆะสแตติกสาธารณะหลัก (String args []) {Mythread rt = Mythread ใหม่ (); / * เธรดหลักสร้างวัตถุที่รันได้ * / Thread t = เธรดใหม่ (rt); / * เธรดหลักสร้างเธรดลูกและส่งผ่านวัตถุที่รันได้ * / t.start (); สำหรับ (int i = 0; i <10; i ++) {System.Out.Print ("เธรดหลัก"); }}} / * เอาต์พุต * / เธรดหลักเธรดหลักเธรดหลักเธรดเธรดเธรดเด็กเธรดเธรดเธรดเธรดเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธอาคารเธซเธซเธซเธเธ 

ในรหัสข้างต้นฉันได้สร้างคลาส Runnablethread ที่ใช้อินเตอร์เฟส Runnable และกำหนดงานของเธรดโดยใช้เมธอด run () ของอินเตอร์เฟส Runnable จากนั้นฉันก็สร้าง mainththread ของ class ที่มี method หลัก ภายในเมธอดหลักฉันประกาศวัตถุที่รันได้ของคลาส Runnablethread และส่งวัตถุนี้ไปยังตัวสร้างของเธรดในขณะที่ประกาศเธรด ด้วยวิธีนี้ฉันเชื่อมโยงวัตถุเธรด (t) กับวัตถุที่เรียกใช้ (rt) จากนั้นวัตถุเธรดจะเรียกใช้เมธอดเริ่มต้นของเธรดซึ่งเรียกใช้เมธอด run ของคลาส Runnablethread เพิ่มเติม หากฉันไม่ได้เชื่อมโยงวัตถุที่เรียกใช้กับวัตถุของเธรดได้แล้ววิธีการเริ่มต้นเธรดจะเรียกใช้วิธีการเรียกใช้ของคลาสของเธรด ตอนนี้อีกครั้งที่มีสองกระทู้ในรหัส, หัวข้อหลักและหัวข้อหลักสร้างหัวข้อเด็กทั้งสองได้รับการดำเนินการพร้อมกัน แต่ไม่สามารถทำเอาต์พุตที่แน่นอน

ความแตกต่างที่สำคัญระหว่างเธรดและ Runnable ใน Java

  1. แต่ละเธรดที่สร้างโดยการขยายคลาสเธรดจะสร้างวัตถุที่ไม่ซ้ำกันและเชื่อมโยงกับวัตถุนั้น แต่ละเธรดที่สร้างขึ้นโดยการนำอินเตอร์เฟส Runnable มาใช้ร่วมกับอินสแตนซ์ที่รันได้เดียวกัน
  2. เนื่องจากแต่ละเธรดเชื่อมโยงกับวัตถุที่ไม่ซ้ำกันเมื่อสร้างขึ้นโดยการขยายคลาสของเธรดจึงจำเป็นต้องใช้หน่วยความจำเพิ่มเติม ในทางตรงกันข้ามแต่ละเธรดที่สร้างขึ้นโดยการใช้อินเตอร์เฟส Runnable จะแบ่งพื้นที่วัตถุเดียวกันดังนั้นจึงต้องการหน่วยความจำน้อยกว่า
  3. ถ้าคุณขยายคลาสเธรดแล้วคุณสามารถสืบทอดคลาสอื่น ๆ ได้เนื่องจาก Java ไม่อนุญาตให้มีการสืบทอดหลาย ๆ คลาสขณะที่การใช้ Runnable ยังคงให้โอกาสสำหรับคลาสที่จะสืบทอดคลาสอื่น
  4. เราจะต้องขยายคลาสเธรดเฉพาะเมื่อต้องแทนที่หรือชำนาญวิธีอื่นของคลาสเธรด คุณต้องใช้ส่วนติดต่อแบบ Runnable หากคุณต้องการเฉพาะวิธีการรันแบบเชี่ยวชาญเท่านั้น
  5. การขยายคลาสของเธรดแนะนำการมีเพศสัมพันธ์อย่างแน่นหนาในรหัสเนื่องจากโค้ดของเธรดและงานของเธรดนั้นมีคลาสเดียวกัน ในทางกลับกันการใช้งานอินเตอร์เฟส Runnable แนะนำการเชื่อมต่อแบบหลวมในโค้ดเนื่องจากโค้ดของเธรดแยกออกจากงานที่กำหนดให้กับเธรด

สรุป:

มันเป็นที่ต้องการที่จะใช้อินเตอร์เฟซที่เรียกใช้แทนการขยายชั้นเรียนด้าย เนื่องจากการใช้ Runnable ทำให้โค้ดของคุณเชื่อมโยงกันอย่างหลวม ๆ เนื่องจากโค้ดของเธรดต่างจากคลาสที่กำหนดงานให้กับเธรด มันต้องใช้หน่วยความจำน้อยลงและยังช่วยให้ชั้นเรียนที่จะรับช่วงชั้นอื่น ๆ

Top