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

ผู้เขียน: Laura McKinney
วันที่สร้าง: 1 เมษายน 2021
วันที่อัปเดต: 13 พฤษภาคม 2024
Anonim
Difference between Runnable and Callable in Java Thread. | javapedia.net
วิดีโอ: Difference between Runnable and Callable in Java Thread. | javapedia.net

เนื้อหา


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

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

  1. แผนภูมิเปรียบเทียบ
  2. คำนิยาม
  3. ความแตกต่างที่สำคัญ
  4. ข้อสรุป

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

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


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

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

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

ในรหัสด้านบนฉันสร้างคลาส Mythread ที่ขยายคลาสของเธรดและแทนที่เมธอด run ของคลาสของเธรด ในชั้นเรียนที่มีวิธีการหลักฉันสร้างวัตถุเธรด (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.ln ("เธรดรอง" ); }} คลาส mainThread {/ * งานของเธรดหลัก * / โมฆะคงที่หลักสาธารณะ (args สตริง) {Mythread rt = Mythread ใหม่ (); / * เธรดหลักสร้างวัตถุที่รันได้ * / Thread t = เธรดใหม่ (rt); / * เธรดหลักสร้างเธรดลูกและส่งผ่านวัตถุที่รันได้ * / t.start (); สำหรับ (int i = 0; i <10; i ++) {System.Out. ("เธรดหลัก"); }}} / * เอาต์พุต * / เธรดหลักเธรดหลักเธรดหลักเธรดเธรดเธรดเด็กเธรดเธรดเธรดเธรดเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธเธอาคารเธซเธซเธก

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

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

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

สรุป:

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