แนวคิดของ Java Threading <br /> ซึ่งแตกต่างจากภาษาคอมพิวเตอร์อื่น ๆ ส่วนใหญ่ Java รองรับการเขียนโปรแกรมแบบมัลติเธรดในตัว
โปรแกรมมัลติเธรดมีสองส่วนขึ้นไปที่ทำงานพร้อมกัน แต่ละส่วนดังกล่าวในโปรแกรมเรียกว่าเธรดและแต่ละเธรดมีเส้นทางการดำเนินการอิสระ ดังนั้นมัลติเธรดเป็นรูปแบบพิเศษของการทำงานหลายอย่าง
คุณต้องรู้มัลติทาสกิ้งเพราะได้รับการสนับสนุนจากระบบปฏิบัติการที่ทันสมัยทั้งหมด อย่างไรก็ตามมีสองประเภทที่แตกต่างกันของการทำงานหลายประเภท: ตามกระบวนการและตามเธรด มันสำคัญมากที่จะเข้าใจความแตกต่างระหว่างทั้งสอง
สำหรับผู้อ่านหลายคนการทำงานหลายอย่างตามกระบวนการเป็นรูปแบบที่คุ้นเคยมากกว่า กระบวนการเป็นโปรแกรมการดำเนินการเป็นหลัก ดังนั้นการทำงานหลายอย่างตามกระบวนการจึงมีลักษณะโดยอนุญาตให้คอมพิวเตอร์ของคุณเรียกใช้โปรแกรมสองโปรแกรมขึ้นไปพร้อมกัน ตัวอย่างเช่นมัลติทาสกิ้งตามกระบวนการช่วยให้คุณสามารถเรียกใช้คอมไพเลอร์ Java พร้อมกันในขณะที่ใช้ตัวแก้ไขข้อความ ในการทำงานหลายอย่างตามกระบวนการโปรแกรมเป็นหน่วยที่เล็กที่สุดของรหัสที่กำหนดโดยตัวกำหนดตารางเวลา
ในสภาพแวดล้อมมัลติทาสกิ้งที่ใช้เธรดเธรดเป็นหน่วยการดำเนินการที่เล็กที่สุด ซึ่งหมายความว่าโปรแกรมสามารถทำหน้าที่ของสองงานขึ้นไปพร้อมกัน ตัวอย่างเช่นตัวแก้ไขข้อความสามารถจัดรูปแบบข้อความขณะพิมพ์ ดังนั้นโปรแกรมหลายกระบวนการจึงจัดการ "ภาพใหญ่" ในขณะที่โปรแกรมหลายเธรดจัดการรายละเอียด
โปรแกรมมัลติเธรดต้องการค่าใช้จ่ายในการดูแลระบบน้อยกว่าโปรแกรมหลายกระบวนการ กระบวนการเป็นงานหนักที่ต้องใช้พื้นที่ที่อยู่อิสระของตนเอง การสื่อสารระหว่างกระบวนการมีราคาแพงและถูก จำกัด การเปลี่ยนแปลงระหว่างกระบวนการก็มีค่าใช้จ่ายสูงมาก ในทางกลับกันเธรดเป็นผู้เล่นที่มีน้ำหนักเบา พวกเขาแบ่งปันพื้นที่ที่อยู่เดียวกันและแบ่งปันกระบวนการเดียวกันร่วมกัน การสื่อสารระหว่างเธรดมีราคาถูกและการแปลงระหว่างเธรดก็เป็นราคาต่ำ เมื่อโปรแกรม Java ใช้สภาพแวดล้อมการประมวลผลงานหลายกระบวนการโปรแกรมหลายกระบวนการจะไม่ถูกควบคุมโดย Java ในขณะที่มัลติเธรดถูกควบคุมโดย Java
การมัลติเธรดช่วยให้คุณเขียนโปรแกรมที่มีประสิทธิภาพด้วยการใช้ CPU สูงสุดเนื่องจากเวลาว่างจะถูกเก็บไว้ให้น้อยที่สุด นี่เป็นสิ่งสำคัญสำหรับสภาพแวดล้อมการเชื่อมต่อระหว่างเครือข่ายแบบโต้ตอบที่ทำงานใน Java เนื่องจากเวลาว่างเป็นสาธารณะ ตัวอย่างเช่นอัตราการส่งข้อมูลของเครือข่ายต่ำกว่าความสามารถในการประมวลผลของคอมพิวเตอร์มากและความเร็วในการอ่านและการเขียนของทรัพยากรระบบไฟล์ในท้องถิ่นนั้นต่ำกว่า CPU มาก . ในสภาพแวดล้อมแบบเธรดเดี่ยวแบบดั้งเดิมโปรแกรมของคุณจะต้องรอให้แต่ละงานดังกล่าวเสร็จสมบูรณ์ก่อนที่จะทำตามขั้นตอนต่อไป-แม้ว่า CPU จะมีเวลาว่างมาก มัลติเธรดช่วยให้คุณได้รับและใช้เวลาว่างให้มากที่สุด
รุ่นเกลียว Java
ระบบรันไทม์ Java อาศัยเธรดในหลาย ๆ ด้านและการออกแบบไลบรารีคลาสทั้งหมดคำนึงถึงการทำมัลติเธรด ในความเป็นจริง Java ใช้เธรดเพื่อสร้างสภาพแวดล้อมทั้งหมดแบบอะซิงโครนัส สิ่งนี้จะช่วยลดส่วนที่ไม่ถูกต้องโดยการป้องกันการสูญเสียของลูป CPU
เพื่อให้เข้าใจถึงข้อดีของสภาพแวดล้อมแบบมัลติเธรดได้ดีขึ้นสามารถเปรียบเทียบกับการควบคุมได้ วิธีการประมวลผลของระบบเธรดเดียวคือการใช้วิธีการวนซ้ำเหตุการณ์ที่เรียกว่าการสำรวจ ในรุ่นนี้การควบคุมแบบเธรดเดี่ยวจะทำงานในวงไม่มีที่สิ้นสุดโดยสำรวจลำดับเหตุการณ์เพื่อกำหนดว่าจะทำอย่างไรต่อไป เมื่ออุปกรณ์การสำรวจส่งคืนสัญญาณว่าไฟล์เครือข่ายพร้อมที่จะอ่านการควบคุมการกำหนดเวลาลูปเหตุการณ์จะจัดการกับตัวจัดการเหตุการณ์ที่เหมาะสม จนกว่าตัวจัดการเหตุการณ์จะกลับมาไม่มีเหตุการณ์อื่นเกิดขึ้นในระบบ สิ่งนี้เสียเวลา CPU สิ่งนี้ทำให้ส่วนหนึ่งของโปรแกรมครอบครองระบบโดยเฉพาะและป้องกันการดำเนินการของเหตุการณ์อื่น ๆ โดยทั่วไปในสภาพแวดล้อมแบบเธรดเดียวเมื่อบล็อกเธรด (บล็อกระงับการดำเนินการ) ในขณะที่รอทรัพยากรโปรแกรมทั้งหมดหยุดทำงาน
ข้อได้เปรียบของ Java Multithreading คือการยกเลิกกลไกการวนซ้ำ/การสำรวจหลัก เธรดสามารถหยุดชั่วคราวโดยไม่ส่งผลกระทบต่อส่วนอื่น ๆ ของโปรแกรม ตัวอย่างเช่นเวลาว่างที่สร้างขึ้นเมื่อเธรดอ่านข้อมูลจากเครือข่ายหรือรอการป้อนข้อมูลผู้ใช้สามารถใช้งานได้ที่อื่น มัลติเธรดช่วยให้ลูปสดนอนหลับได้หนึ่งวินาทีในแต่ละเฟรมช่องว่างโดยไม่หยุดระบบทั้งหมด มีการอุดตันของเธรดในโปรแกรม Java มีเพียงหนึ่งเธรดที่ถูกระงับและเธรดอื่น ๆ ยังคงทำงานต่อไป
เธรดมีอยู่ในหลายรัฐ เธรดสามารถทำงานได้ มันสามารถทำงานได้ตราบเท่าที่คุณได้เวลา CPU เธรดที่รันสามารถถูกระงับและขัดจังหวะการดำเนินการชั่วคราว เธรดที่ถูกระงับสามารถกลับมาทำงานต่อได้ทำให้สามารถทำงานต่อไปได้
เมื่อใดก็ตามที่เธรดสามารถยุติซึ่งขัดจังหวะการทำงานได้ทันที เมื่อสิ้นสุดเธรดจะไม่สามารถกู้คืนได้
ลำดับความสำคัญของเธรด
Java จัดลำดับความสำคัญแต่ละเธรดเพื่อกำหนดวิธีการรักษาเธรดเมื่อเปรียบเทียบกับเธรดอื่น ๆ ลำดับความสำคัญของเธรดเป็นจำนวนเต็มที่ให้รายละเอียดความสัมพันธ์ลำดับความสำคัญระหว่างเธรด ในฐานะที่เป็นค่าสัมบูรณ์ลำดับความสำคัญนั้นไม่มีความหมาย แต่จะใช้ลำดับความสำคัญของเธรดเพื่อกำหนดว่าจะสลับจากเธรดหนึ่งไปยังอีกเธรดหนึ่ง สิ่งนี้เรียกว่า "สวิตช์บริบท" กฎที่กำหนดการแปลงบริบทนั้นง่าย:
เธรดสามารถให้การควบคุมโดยอัตโนมัติ ในกรณีของ I/O ที่ไม่แน่ใจการนอนหลับหรือการปิดกั้นจะทำโดยสัมปทานที่ชัดเจน ภายใต้สมมติฐานนี้ตรวจพบเธรดอื่น ๆ ทั้งหมดและเธรดลำดับความสำคัญสูงสุดที่พร้อมใช้งานจะได้รับการมอบให้กับ CPU
เธรดสามารถนำไปไว้ได้โดยเธรดที่มีลำดับความสำคัญสูง ในกรณีนี้เธรดที่มีลำดับความสำคัญต่ำไม่ยอมแพ้อย่างต่อเนื่องโปรเซสเซอร์จะถูกครอบครองก่อน - ไม่ว่าจะทำอะไร - โปรเซสเซอร์ถูกครอบครองโดยเธรดที่มีลำดับความสำคัญสูง โดยทั่วไปเมื่อเธรดลำดับความสำคัญสูงกำลังจะทำงานแล้วมันจะดำเนินการ สิ่งนี้เรียกว่าการทำงานหลายอย่างลำดับความสำคัญ
สถานการณ์มีความซับซ้อนเล็กน้อยเมื่อสองเธรดที่มีลำดับความสำคัญเดียวกันแข่งขันกับรอบ CPU สำหรับระบบปฏิบัติการเช่น Windows 98 เธรดที่มีลำดับความสำคัญเท่ากันจะแบ่งเวลาในโหมดลูปโดยอัตโนมัติ สำหรับระบบปฏิบัติการอื่น ๆ เช่น Solaris 2.x เธรดลำดับความสำคัญจะถูกยกเลิกโดยอัตโนมัติเมื่อเทียบกับเพื่อนของพวกเขา หากไม่เป็นเช่นนั้นเธรดอื่นจะไม่ทำงาน
คำเตือน: การแปลงบริบทของเธรดลำดับความสำคัญที่ต่ำกว่าในระบบปฏิบัติการที่แตกต่างกันอาจสร้างข้อผิดพลาด
การซิงโครไนซ์
เนื่องจากมัลติเธรดแนะนำพฤติกรรมแบบอะซิงโครนัสในโปรแกรมของคุณจึงต้องมีวิธีเพิ่มการซิงโครไนซ์เมื่อคุณต้องการ ตัวอย่างเช่นหากคุณต้องการให้สองเธรดในการสื่อสารซึ่งกันและกันและแบ่งปันโครงสร้างข้อมูลที่ซับซ้อนเช่นลำดับของรายการที่เชื่อมโยงคุณต้องมีวิธีบางอย่างเพื่อให้แน่ใจว่าพวกเขาจะไม่ขัดแย้งกัน นั่นคือคุณต้องป้องกันไม่ให้เธรดหนึ่งเขียนข้อมูลในขณะที่เธรดอื่นกำลังอ่านข้อมูลจากรายการที่เชื่อมโยง ด้วยเหตุนี้ Java จึงใช้วิธีการอื่นตามรูปแบบเก่าของการซิงโครไนซ์ระหว่างกระบวนการ: การตรวจสอบ กระบวนการจัดการเป็นกลไกการควบคุมแรกที่กำหนดโดย Carhoare
คุณสามารถนึกถึงกระบวนการจัดการเป็นกล่องขนาดเล็กที่ควบคุมเธรดเดียวเท่านั้น เมื่อเธรดเข้าสู่ท่อเธรดทั้งหมดจะต้องรอจนกว่าเธรดจะออกจากท่อ ด้วยวิธีนี้ฝ่ายบริหารสามารถใช้เพื่อป้องกันไม่ให้ทรัพยากรที่ใช้ร่วมกันถูกจัดการโดยหลายเธรด
ระบบมัลติเธรดจำนวนมากถือว่ากระบวนการจัดการเป็นวัตถุที่โปรแกรมต้องอ้างถึงและใช้งานอย่างชัดเจน Java เป็นวิธีแก้ปัญหาที่ชัดเจน ไม่มีคลาส "ตรวจสอบ" เมื่อเธรดรวมอยู่ในวิธีการซิงโครไนซ์จะไม่มีเธรดอื่นใดสามารถเรียกวิธีการซิงโครไนซ์ของวัตถุเดียวกัน สิ่งนี้ช่วยให้คุณเขียนโค้ดหลายเธรดที่ชัดเจนและรัดกุมเนื่องจากการสนับสนุนการซิงโครไนซ์นั้นอยู่ในภาษา
การส่งข้อความ
หลังจากที่คุณแบ่งโปรแกรมออกเป็นหลายเธรดคุณต้องกำหนดการเชื่อมต่อระหว่างแต่ละเธรด เมื่อวางแผนในภาษาอื่น ๆ ส่วนใหญ่คุณต้องพึ่งพาระบบปฏิบัติการเพื่อสร้างการสื่อสารระหว่างเธรด สิ่งนี้จะเพิ่มค่าใช้จ่ายอย่างแน่นอน อย่างไรก็ตาม Java ให้วิธีการที่สะอาดและราคาประหยัดในการพูดคุยระหว่างมัลติเธรด - โดยการเรียกใช้วิธีการที่กำหนดไว้ล่วงหน้าที่วัตถุทั้งหมดมี ระบบการส่งข้อความของ Java อนุญาตให้เธรดป้อนวิธีการแบบซิงโครนัสของวัตถุแล้วรอที่นั่นจนกว่าเธรดอื่นจะแจ้งให้ทราบอย่างชัดเจน
คลาสเธรดและอินเทอร์เฟซที่รันได้
ระบบมัลติเธรดของ Java นั้นขึ้นอยู่กับคลาสเธรดวิธีการและอินเทอร์เฟซ บริษัท ร่วมทำงานได้ คลาสเธรดห่อหุ้มการทำงานของเธรด เนื่องจากคุณไม่สามารถอ้างถึงสถานะของเธรดที่กำลังรันได้โดยตรงคุณจึงต้องประมวลผลผ่านพร็อกซีดังนั้นอินสแตนซ์ของเธรดจึงถูกสร้างขึ้น ในการสร้างเธรดใหม่โปรแกรมของคุณจะต้องขยายเธรดหรือใช้อินเทอร์เฟซ Runnable
คลาสเธรดกำหนดวิธีการหลายวิธีเพื่อช่วยจัดการเธรด วิธีการที่ใช้ในบทนี้แสดงในตาราง: