"สวัสดี Amigo! เรามีหัวข้อใหม่และยากมาก ฉันขอโทษ มักจะถูกมองว่าเป็นหนึ่งในหัวข้อที่ซับซ้อนที่สุด ไม่เพียงแต่ใน Java เท่านั้น แต่ยังรวมถึงการเขียนโปรแกรมโดยทั่วไปด้วย ฉันกำลังพูดถึงมัลติเธรด "

ลองนึกภาพเกมคอมพิวเตอร์ทั่วไป เช่น เกมแข่งยานอวกาศ คุณกำลังบินผ่านพื้นที่กว้างใหญ่ของจักรวาล หลบอุกกาบาตและยานลาดตระเวน อีกสองโหลเข้าร่วมกับคุณในการแข่งขันที่ผิดกฎหมายเหล่านี้

สมมติว่าคุณตัดสินใจที่จะเขียนเกมดังกล่าว โปรแกรมของคุณจะต้องติดตามคำสั่ง (ป้อนข้อมูลด้วยแป้นพิมพ์) ย้ายยานอวกาศ คำนวณวิถีโคจร กำหนดผลที่ตามมาของการชนกัน และวาดทั้งหมดนี้บนหน้าจอของผู้ใช้ นี่เป็นงานที่ซับซ้อนมาก

จำวิธีที่เราแก้ไข «ปัญหาของความซับซ้อนมาก» ในตัวอย่างเกี่ยวกับบริษัทขนส่งที่กำลังเติบโตได้อย่างไร

เราแบ่งออกเป็นแผนกอิสระและระบุอย่างเข้มงวด (เป็นมาตรฐาน) ว่าพวกเขาจะโต้ตอบกันได้อย่างไร

"แต่เราจะทำอย่างไรเมื่อส่วนที่เป็นอิสระต้องทำงานบางอย่างควบคู่ไปกับส่วนอื่น ๆ ?! คำตอบสำหรับคำถามนี้คือเธรด "

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

"ฉันสามารถเห็นมันในใจของฉัน เค้ก!"

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

ดังนั้น เราไม่เพียงแต่สามารถแบ่งโปรแกรมออกเป็นส่วนๆ/ออบเจกต์อิสระเท่านั้น แต่ยังทำให้ส่วนเหล่านี้สามารถทำงานได้อย่างอิสระจากกัน ยิ่งปฏิสัมพันธ์ระหว่างแต่ละส่วนน้อยลงเท่าใด โปรแกรมก็ยิ่งซับซ้อนน้อยลงเท่านั้น

ลองนึกภาพว่าคุณสามารถแทนที่ผู้จัดการด้วยสคริปต์ ที่ส่งจดหมาย และแผนกอื่นๆ ของบริษัทก็ไม่สามารถบอกได้ว่ามีการเปลี่ยนแปลง เรื่องทำนองนี้เกิดขึ้นตั้งแต่ช่วงต้นศตวรรษที่ 26 ด้วยผลงานที่ยอดเยี่ยม ผู้จัดการส่วนใหญ่และแม้แต่ผู้บริหารระดับสูงสามารถถูกแทนที่ด้วยสคริปต์ที่มีความซับซ้อนปานกลางได้สำเร็จ หลังจาก «สหภาพแพลงก์ตอนสำนักงาน» เข้าแทรกแซง การปลดพนักงานจำนวนมากก็สิ้นสุดลง แต่ฉันพูดนอกเรื่อง

"น่าสนใจจัง!"

"ไม่เพียงแต่จะมี "หุ่นยนต์ตัวน้อย" หลายตัวเท่านั้นที่รันโค้ดได้ พวกมันยังสามารถสื่อสารระหว่างกันและวางไข่หุ่นยนต์ตัวใหม่ได้อีกด้วย"

"วางไข่หุ่นยนต์ใหม่?"

"ใช่ เพื่อทำงานใหม่ บางครั้งการสร้างโรบ็อตอีกตัว (เธรดอื่น) เพื่อดำเนินการบางอย่างในเวลาเดียวกันกับเธรดปัจจุบัน (โรบ็อต) ก็เป็นข้อได้เปรียบ"

" นี่ฟังดูดี แต่ฉันนึกไม่ออกว่าจะใช้มันที่ไหน "

แล้วทำไมเราถึงเรียกมันว่า « เธรด »?

"ลองนึกภาพว่าหุ่นยนต์แต่ละตัวมีสีต่างกัน และทำเครื่องหมายคำสั่งด้วยสีของมันขณะที่มันทำ เส้นทางที่หุ่นยนต์ตัวเล็กใช้นั้นเหมือนกับเส้นที่ดินสอทิ้งไว้ เส้นทางนี้ร้อยไปตามด้านหลังหุ่นยนต์ เหมือนกับด้ายที่อยู่ข้างหลัง เข็ม"

«หุ่นยนต์ตัวเล็ก» แต่ละตัวมีหน้าที่ที่สร้างขึ้นมาเพื่อปฏิบัติ คุณสามารถนึกถึงเธรดคือชุดคำสั่งที่ดำเนินการในขณะที่ทำงานนี้

สมมติว่าคุณกำลังบินบนยานอวกาศเพื่อส่งสินค้า จากนั้น «ส่งมอบสินค้า» คืองานของคุณ และคุณกำลังดำเนินการอยู่ และเส้นทางการบินของคุณคือสายใยของคุณ เราสามารถพูดได้ว่างานใหม่แต่ละงาน แต่ละงานที่ยังไม่เสร็จสมบูรณ์ มีเธรดของตัวเอง (เส้นทางที่ยังต้องสำรวจ)

"กล่าวอีกนัยหนึ่งคือมีงานและ "หุ่นยนต์ตัวน้อย" ที่ดำเนินการ และด้ายเป็นเพียงเส้นทางที่หุ่นยนต์ใช้ในขณะที่มันทำงานให้เสร็จ?

"อย่างแน่นอน."

นั่นคือวิธีการทำงานทั้งหมดที่อยู่ลึกเข้าไปข้างใน เนื่องจากคอมพิวเตอร์มีโปรเซสเซอร์เพียงตัวเดียว จึงสามารถดำเนินการได้ครั้งละหนึ่งคำสั่งเท่านั้น นี่คือสิ่งที่เกิดขึ้น: โปรเซสเซอร์จะสลับไปมาระหว่างเธรดอย่างต่อเนื่อง โดยจะสลับไปยังเธรดใหม่ รันคำสั่งสองสามคำสั่ง จากนั้นสลับไปยังเธรดถัดไป รันคำสั่งบางอย่าง และอื่นๆ แต่เนื่องจากการสลับระหว่างเธรดเกิดขึ้นหลายร้อยครั้งต่อวินาที สำหรับเราแล้วดูเหมือนว่าเธรดทั้งหมดจะทำงานพร้อมกัน

มัลติเธรด - 1