การแนะนำ
ก่อนที่จะเรียนรู้เกี่ยวกับเธรด Java เรามาดูอนาคตอันใกล้กันก่อน ลองนึกภาพคุณส่งเรซูเม่ของคุณและไปสัมภาษณ์ คุณและเพื่อนร่วมงานในอนาคตอีกสองสามสิบคนได้รับเชิญให้ทำงานในบริษัทซอฟต์แวร์ขนาดใหญ่ ท่ามกลางความยุ่งยากอื่นๆ คุณต้องส่งเอกสารการจ้างงานให้กับพนักงานฝ่ายทรัพยากรบุคคลที่เหนื่อยล้า
เพื่อเร่งกระบวนการ ผู้สมัครตำแหน่งสามารถแบ่งออกเป็นสองกลุ่มและกระจายระหว่างผู้จัดการฝ่ายทรัพยากรบุคคลสองคน (ถ้ามีในบริษัท) เป็นผลให้เราเร่งกระบวนการให้เร็วขึ้นเนื่องจากงาน
ออกแบบ แบบขนาน
หากบริษัทมีเจ้าหน้าที่ฝ่ายบุคคลเพียงคนเดียว คุณจะต้องออกไป ตัวอย่างเช่น คุณสามารถแบ่งทุกคนออกเป็นสองกลุ่มได้อีกครั้ง เช่น สัมภาษณ์เด็กผู้หญิงและเด็กผู้ชายตามลำดับ
หรือตามหลักการอื่นคือเนื่องจากกลุ่มล่างมีคนมากกว่าเราจึงจะสลับเด็กหญิงสองคนให้เด็กชายหนึ่งคน
วิธีการจัดระเบียบ งานนี้เรียกว่า
แบบมัลติเธรด เจ้าหน้าที่ทรัพยากรบุคคลที่เหนื่อยล้าของเราสลับไปยังกลุ่มต่างๆ เพื่อรับสมัครพนักงานคนต่อไป อาจมีสิบเอ็ดกลุ่มและเจ้าหน้าที่บุคคลสี่คน ในกรณีนี้
การประมวลผล แบบมัลติเธรด จะเกิดขึ้นพร้อมกันโดย HR หลายคน ซึ่งสามารถนำบุคคลถัดไปจากกลุ่มใดก็ได้มาประมวลผลเอกสารของเขา
กระบวนการ
กระบวนการ (
กระบวนการ ) ในกรณีนี้จะเป็นองค์กรของงานรับเอกสาร ในองค์กร สามารถแยกแยะกระบวนการต่างๆ ได้: การบัญชี การพัฒนาซอฟต์แวร์ การประชุมกับลูกค้า การดำเนินงานคลังสินค้า ฯลฯ มีการจัดสรรทรัพยากรสำหรับแต่ละกระบวนการ: สถานที่ พนักงานสำหรับการดำเนินการ กระบวนการต่างๆ แยกจากกัน: เจ้าหน้าที่ทรัพยากรบุคคลไม่สามารถเข้าถึงฐานข้อมูลทางบัญชี และผู้จัดการฝ่ายบริการลูกค้าไม่ได้วิ่งรอบๆ คลังสินค้า หากกระบวนการจำเป็นต้องเข้าถึงทรัพยากรของบุคคลอื่น จำเป็นต้องสร้างการสื่อสารระหว่างกระบวนการ: บันทึกช่วยจำ การประชุมร่วม
สตรีม
งานในกระบวนการถูกจัดระเบียบเป็นเธรด (
java thread
) สำหรับแผนกทรัพยากรบุคคล Flow คือองค์กรของงานเพื่อรับใช้กลุ่ม ในภาพแรกมีหนึ่งโฟลว์ ในสามโฟลว์ถัดไปมีสองโฟลว์ ภายในกระบวนการ เธรดสามารถดำเนินการแบบคู่ขนานได้ - เจ้าหน้าที่ฝ่ายทรัพยากรบุคคลสองคนยอมรับกลุ่มพนักงานในอนาคตสองกลุ่มขึ้นไป ปฏิสัมพันธ์ของเจ้าหน้าที่ฝ่ายบุคคลกับกลุ่ม - การประมวลผลเธรดภายในกระบวนการ - เรียกว่า
การซิงโครไนซ์เธรด ภาพวาดการออกแบบของทั้งสองกลุ่มโดยเจ้าหน้าที่ฝ่ายบุคคลหนึ่งคนแสดงวิธีการ: เครื่องแบบ (เด็กหญิง - เด็กชาย - เด็กหญิง - เด็กชาย) และลำดับความสำคัญที่แตกต่างกัน (เด็กหญิงสองคนสลับกับเด็กชายหนึ่งคน) เธรดสามารถเข้าถึงทรัพยากรของกระบวนการที่พวกเขาอยู่: กลุ่มต่างๆ ให้กับเจ้าหน้าที่ฝ่ายทรัพยากรบุคคลจะได้รับตัวอย่างแบบฟอร์มใบสมัคร ปากกาสำหรับกรอกเอกสาร แต่หากกระแสมีปฏิสัมพันธ์กับสิ่งต่างๆ ที่เหมือนกัน เหตุการณ์ต่างๆ ก็เกิดขึ้นได้ หากเจ้าหน้าที่ฝ่ายบุคคลขอให้คุณตะโกนชื่อคนสุดท้ายในคิว ในกรณีของสองกลุ่มเขาไม่แน่ใจล่วงหน้าว่าจะได้ยินชื่อผู้หญิงหรือผู้ชาย ข้อขัดแย้งในการเข้าถึงข้อมูล การบล็อก และวิธีแก้ไขถือเป็นหัวข้อที่สำคัญมาก
สถานะการไหล
แต่ละเธรดอยู่ในสถานะใดสถานะหนึ่งต่อไปนี้:
- สร้างแล้ว (
New
) – แถวสำหรับเจ้าหน้าที่ HR กำลังเตรียมพร้อม ผู้คนกำลังจัดระเบียบ
- เปิดตัว (
Runnable
) – คิวของเราเข้าแถวสำหรับเจ้าหน้าที่ฝ่ายทรัพยากรบุคคลและกำลังดำเนินการ
- โดนบล็อค (
Blocked
) – ชายหนุ่มคนสุดท้ายในคิวพยายามตะโกนชื่อ แต่เมื่อได้ยินว่าสาวในกลุ่มถัดไปเริ่มทำสิ่งนี้ต่อหน้าเขา เขาก็เงียบไป
- เสร็จสิ้น (
Terminated
) - เจ้าหน้าที่ฝ่ายทรัพยากรบุคคลได้ดำเนินการคิวทั้งหมดให้เสร็จสิ้นแล้ว และไม่จำเป็นต้องดำเนินการดังกล่าว
- กำลังรอ (
Waiting
) - คิวหนึ่งกำลังรอสัญญาณจากอีกคิวหนึ่ง
การจัดระเบียบเธรดและการโต้ตอบเป็นพื้นฐานสำหรับการดำเนินการกระบวนการอย่างมีประสิทธิผล
กลับมาสู่โลกไอทีกันเถอะ
ในศตวรรษที่ 21 การประมวลผลแบบมัลติเธรดและแบบขนานมีความเกี่ยวข้องกัน ตั้งแต่ทศวรรษที่ 90 ของศตวรรษที่ผ่านมา ระบบปฏิบัติการมัลติทาสกิ้ง Windows, MacOS และ Linux ได้รับการยอมรับอย่างมั่นคงบนคอมพิวเตอร์ที่บ้าน คุณมักจะพบโปรเซสเซอร์หลักสี่ตัวขึ้นไปในนั้น จำนวนบล็อกขนานของการ์ดวิดีโอ GPU เกินหนึ่งพันแล้ว โปรแกรมยอดนิยมเขียนโดยคำนึงถึงมัลติเธรด (มัลติเธรด) เช่นซอฟต์แวร์เวอร์ชันทันสมัยสำหรับการประมวลผลกราฟิกวิดีโอหรือทำงานกับข้อมูลจำนวนมาก: Adobe Photoshop, WinRar, Mathematica, เกมสมัยใหม่ Java multithreading เป็นหัวข้อที่สำคัญ ได้รับความนิยมและซับซ้อนมาก ดังนั้นในหลักสูตร JavaRush จึงมีงานมากมายที่ต้องทำความเข้าใจเป็นอย่างดี ตัวอย่าง Java บนมัลติเธรดจะช่วยให้คุณเชี่ยวชาญความแตกต่างพื้นฐานและรายละเอียดปลีกย่อยของพื้นที่นี้ โดยประสานการทำงานของเธรด
กระบวนการ
กระบวนการคืออินสแตนซ์ที่ทำงานอยู่ของโปรแกรมที่ระบบปฏิบัติการ (OS) ได้จัดสรรหน่วยความจำ เวลา/คอร์ของโปรเซสเซอร์ และทรัพยากรอื่นๆ ให้ สิ่งสำคัญคือต้องจัดสรรหน่วยความจำแยกกัน พื้นที่ที่อยู่ของกระบวนการที่แตกต่างกันไม่สามารถเข้าถึงได้ซึ่งกันและกัน หากกระบวนการจำเป็นต้องสื่อสาร ก็สามารถทำได้โดยใช้ไฟล์ ไปป์ และวิธีการสื่อสารระหว่างกระบวนการอื่นๆ
ไหล
ชวา
Thread
(สตรีม) บางครั้ง เพื่อหลีกเลี่ยงความสับสนกับคลาส Java อื่น
Stream
และสิ่งที่คล้ายกัน เธรด Java มักถูกแปลเป็นเธรด พวกเขาใช้ทรัพยากรที่จัดสรรให้กับกระบวนการและเป็นวิธีการดำเนินการของกระบวนการ เธรดหลักดำเนินการเมธอด
main
และออก เมื่อกระบวนการดำเนินการ เธรดเพิ่มเติม (เธรดย่อย) สามารถวางไข่ได้ เธรดของกระบวนการเดียวกันสามารถแลกเปลี่ยนข้อมูลระหว่างกันได้ Java multithreading จำเป็นต้องคำนึงถึงการซิงโครไนซ์ข้อมูล อย่าลืมเรื่องนี้ด้วย ใน Java กระบวนการยุติลงเมื่อเธรดสุดท้ายเสร็จสิ้น สำหรับงานเบื้องหลัง เธรดสามารถเริ่มต้นเป็น daemon (
daemon
) ได้ ความแตกต่างจากงานทั่วไปคือ เธรดจะถูกบังคับให้ยุติเมื่อ
daemon
เธรดที่ไม่ใช่ของกระบวนการทั้งหมดยุติลง
แอปพลิเคชันแบบมัลติเธรดตัวแรก
มีวิธีสร้างเธรดมากกว่าครึ่งโหล ในหลักสูตร JavaRush เราจะตรวจสอบอย่างละเอียด ก่อนอื่นเรามาทำความคุ้นเคยกับหนึ่งในพื้นฐานกันก่อน มีคลาสพิเศษ
Thread
ในวิธีการ
run()
ที่คุณต้องเขียนโค้ดที่ใช้ตรรกะของโปรแกรม หลังจากสร้างเธรดแล้ว คุณสามารถเริ่มต้นได้โดยเรียกไฟล์
start()
. มาเขียนโปรแกรมสาธิตที่ใช้ตัวอย่างของ Java multithreading
class PeopleQueue extends Thread {
private String[] names;
PeopleQueue(String... names) {
this.names = names;
}
@Override
public void run() {
for (int i = 0; i < names.length; i++) {
System.out.println("Обработаны documentы: " + names[i]);
try {
sleep(500);
} catch (Exception e) {}
}
}
}
public class HR {
public static void main(String[] args) {
PeopleQueue queue1 = new PeopleQueue("Ivan","Сергей","Николай","Фердинанд","Basil");
PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина","Olga");
System.out.println("Начали!");
queue1.start();
queue2.start();
}
}
มาเปิดโปรแกรมกันเถอะ คอนโซลจะแสดงเอาต์พุตข้อความจากเธรดหลัก ถัดไป แต่ละเธรดย่อย
queue1
จะ
queue2
ส่งข้อความไปยังคอนโซลทั่วไปเกี่ยวกับพนักงานที่ถูกประมวลผลคนถัดไป หนึ่งในตัวเลือกที่เป็นไปได้สำหรับโปรแกรม:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй
Process finished with exit code 0
มัลติเธรดใน Javaเป็นหัวข้อที่ซับซ้อนและหลากหลาย ความสามารถในการเขียนโค้ดโดยใช้การประมวลผลแบบขนาน มัลติทาสกิ้ง และมัลติเธรด จะช่วยให้คุณดำเนินงานบนโปรเซสเซอร์และคลัสเตอร์แบบมัลติคอร์สมัยใหม่ที่ประกอบด้วยคอมพิวเตอร์หลายเครื่องได้อย่างมีประสิทธิภาพ
GO TO FULL VERSION