13. เธรด(Thread)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

13. เธรด(Thread)

            เธรดคือระบบของจาวาสำหรับการสนับสนุนการทำงานแบบ multi-tasking แบบที่ในระบบปฏิบัติการก็จะให้โปรแกรมสามารถทำงานพร้อมกันได้ เช่น ฟังเพลงไปด้วยพิมพ์งานไปด้วยก็ได้ นอกจากนี้เธรดยังสามารถทำงานพร้อมกันได้ด้วยเรียกว่า multi-thread

เธรด

            เธรดเป็นการทำงานหลายงานพร้อมกันก็จริงแต่สำหรับเธรดนั้นจะไม่ได้ใช้พื้นที่เยอะเหมือนโปรเซส(processes)เนื่องมาจากว่าเธรด มี stack, program counter และ local variable ที่เป็นของตัวเอง แต่ใช้ทรัพยากรอื่นร่วมกันกับเธรดตัวอื่นที่มีอยู่ในโปรเซสเดียวกัน เช่น memory, file handlers และ pre‐process state อื่น ๆ ก็เลยเรียกโปรเซสว่า “heavyweight process” และเรียกเธรดว่าเป็น “lightweight process” เธรดเป็นเพียงหน่วยการทำงานของโปรแกรม

สาเหตุหลักที่ต้องมีเธรด ในโปรแกรมก็เพราะต้องการให้การแสดงผลเป็นไปได้อย่างรวดเร็ว เช่นถ้ามีโปรแกรมที่ใช้เวลาในการประมวลผลใน CPU มาก ๆ ก็จะทำให้การสนองตอบจะช้าลง การนำเอาเธรดเข้ามาช่วยจะเหมือนกับว่าสามารถทำงานสองอย่างในเวลาเดียวกัน แต่ที่จริงแล้ว ระบบทำการสลับการใช้ CPU ระหว่างโปรแกรมต่าง ๆ เมื่อสิ้นสุดก็กลับมาทำงานเดิมต่อ

ชีวิตของเธรด

 

รูป13-1

1.      เริ่มต้นชีวิตด้วยคีย์เวิร์ด new

2.      ใช้คำสั่ง start ให้เธรดเริ่มทำงาน โดยเธรดจะทำตามสิ่งที่อยู่ในเมท็อด run ต้อง override เมท็อดนี้

3.      Time waiting คือบางครั้งทำงานอยู่ก็สามารถให้เธรดหยุดการทำงานชั่วคราวได้ โดยใช้เมท็อด sleep หรือ เมท็อด wait

4.      เธรดกลับมาทำงานเหมือนเดิมจากการตื่นจาก sleep หรือ ไม่ก็ถูกปลุกด้วย notify

5.      Terminated คือการหยุดทำงานเมื่อจบคำสั่งจาก run

ประเภทของเธรด

            ประเภทของเธรดมี 2 แบบ

1.แบบ extends Thread

            public void run( ){ }

2. แบบ implements Runnable

            public void run( ){ }

            ไม่ว่าจะ extends หรือ implements มาก็ต้องทำการ override เมท็อด run แล้วจะรู้ได้ยังไงว่าจะต้อง extends หรือ implements – ก็แล้วแต่ว่าคลาสนั้นไป extends อะไรมาก่อนหรือเปล่า เพราะจาวาไม่ให้ extends คลาสหลายๆคลาสพร้อมกันได้(multi-inheritance) ถ้าไป extends อะไรมาแล้วก็ implements เอา

            ตัวอย่างเธรด

 

รูป13-2

บรรทัดที่ 3 : สร้างคลาส TestThread โดยให้ extends Thread มา ถ้าจะใช้อินเทอร์เฟซก็เปลี่ยนเป็น

            implements มาแทน

บรรทัดที่ 5 : override เมท็อด run ข้างหน้าเลข 5 จะมีรูปสามเหลี่ยมสีเขียวบอกว่าทำการ override เมท็อด

            run จากคลาส Thread

บรรทัดที่ 14 : สร้างอ็อปเจ็คของ TestThread ขึ้นมาและให้ตัวแปรนี้เรียก start();

บรรทัดที่ 15 : เรียก start();

ผลลัพธ์ที่ได้

 

รูป13-3

 

Multi-thread

            เป็นการทำงานของเธรดหลายตัวพร้อมกันโดยการทำงานของเธรดจะเป็นอิสระต่อกัน สามารถใช้multi-thread ด้วยสิ่งที่เรียกว่า anonymous inner class ก็คือคลาสย่อยในคลาสอีกคลาสหนึ่ง

 

รูป 13-4

บรรทัดที่ 5 : new Thread ขึ้นมาแต่จะสังเกตว่ามีการ new Runable ขึ้นมาเป็น anonymous inner class ด้วย

ภายใน Runable ก็ทำการ implements เมท็อด run

บรรทัดที่ 8 : หน้าเลข 8 จะมีสามเหลี่ยมสีขาวเพื่อแสดงการ implements เมท็อดจากคลาส Runable

บรรทัดที่ 11 : ระบุเวลาสำหรับหยุดการทำงานของเธรด หน่วยเป็น millisecond

บรรทัดที่ 13 : แสดงตัวอักษร x ออกจากหน้าจอ

บรรทัดที่ 18 : ให้เธรดแรกเริ่มการทำงาน

บรรทัดที่ 20 : new Thread ขึ้นมาและ new Runable ขึ้นมาเป็น anonymous inner class

บรรทัดที่ 24 : เปลี่ยนเวลาสำหรับหยุดการทำงานเหลือแค่ 50 millisecond

บรรทัดที่ 26 : แสดงตัวอักษร y

ผลลัพธ์

 

รูป13-5

            จะเห็นว่า y จะแสดงออกทางหน้าจอมากกว่า x เพราะเวลาสำหรับหยุดการทำงานของ y นั้นน้อยกว่า x และทุกๆ 2 บรรทัด x และ y จะแสดงออกทางหน้าจอพร้อมกันอยู่บรรทัดเดียวกันก็เพราะว่าเธรดทำงานเป้นอิสระต่อกันจึงสามารถแสดงผลออกมาพร้อมกันได้

เมท็อดในเธรด

            เมท็อด sleep

static void sleep(long millis)

            เมท็อดนี้เธรดจะหยุดทำงานจนครบกำหนดเวลาก็จะคืนค่าออกมาเหมือนเดิม

 

            เมท็อด join

void join (long millis)

                        ถ้าใช้ join กับเธรดตัวไหน เธรดตัวนั้นจะทำงานครบตาม run ก่อนเธรดอื่นถึงจะทำงาน

            เมท็อด wait

void wait()

                        เธรดจะหยุดการทำงานจนกว่า จะมีการเรียกเมท็อด void notify()

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

ใส่ความเห็น