JavaRush /จาวาบล็อก /Random-TH /มัลติเธรดใน Java

มัลติเธรดใน Java

เผยแพร่ในกลุ่ม

การแนะนำ

ก่อนที่จะเรียนรู้เกี่ยวกับเธรด Java เรามาดูอนาคตอันใกล้กันก่อน ลองนึกภาพคุณส่งเรซูเม่ของคุณและไปสัมภาษณ์ คุณและเพื่อนร่วมงานในอนาคตอีกสองสามสิบคนได้รับเชิญให้ทำงานในบริษัทซอฟต์แวร์ขนาดใหญ่ ท่ามกลางความยุ่งยากอื่นๆ คุณต้องส่งเอกสารการจ้างงานให้กับพนักงานฝ่ายทรัพยากรบุคคลที่เหนื่อยล้า
มัลติเธรดใน Java - 1
เพื่อเร่งกระบวนการ ผู้สมัครตำแหน่งสามารถแบ่งออกเป็นสองกลุ่มและกระจายระหว่างผู้จัดการฝ่ายทรัพยากรบุคคลสองคน (ถ้ามีในบริษัท) เป็นผลให้เราเร่งกระบวนการให้เร็วขึ้นเนื่องจากงาน ออกแบบ แบบขนาน
มัลติเธรดใน Java - 2
หากบริษัทมีเจ้าหน้าที่ฝ่ายบุคคลเพียงคนเดียว คุณจะต้องออกไป ตัวอย่างเช่น คุณสามารถแบ่งทุกคนออกเป็นสองกลุ่มได้อีกครั้ง เช่น สัมภาษณ์เด็กผู้หญิงและเด็กผู้ชายตามลำดับ
มัลติเธรดใน Java - 3
หรือตามหลักการอื่นคือเนื่องจากกลุ่มล่างมีคนมากกว่าเราจึงจะสลับเด็กหญิงสองคนให้เด็กชายหนึ่งคน
มัลติเธรดใน Java - 4
วิธีการจัดระเบียบ งานนี้เรียกว่าแบบมัลติเธรด เจ้าหน้าที่ทรัพยากรบุคคลที่เหนื่อยล้าของเราสลับไปยังกลุ่มต่างๆ เพื่อรับสมัครพนักงานคนต่อไป อาจมีสิบเอ็ดกลุ่มและเจ้าหน้าที่บุคคลสี่คน ในกรณีนี้การประมวลผล แบบมัลติเธรด จะเกิดขึ้นพร้อมกันโดย 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    {// Наша очередь из сотрудников, наследник класса Thread
    private String[] names;

    PeopleQueue(String... names) {// Конструктор, аргумент- массив имен сотрудников
        this.names = names;
    }

    @Override
    public void run() { // Этот метод будет вызван при старте потока
        for (int i = 0; i < names.length; i++) { // Вывод в цикле с паузой 0.5 сек очередного сотрудника
            System.out.println("Обработаны documentы: " + names[i]);
            try {
                sleep(500); // Задержка в 0.5 сек
            } 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เป็นหัวข้อที่ซับซ้อนและหลากหลาย ความสามารถในการเขียนโค้ดโดยใช้การประมวลผลแบบขนาน มัลติทาสกิ้ง และมัลติเธรด จะช่วยให้คุณดำเนินงานบนโปรเซสเซอร์และคลัสเตอร์แบบมัลติคอร์สมัยใหม่ที่ประกอบด้วยคอมพิวเตอร์หลายเครื่องได้อย่างมีประสิทธิภาพ
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION