JavaRush /وبلاگ جاوا /Random-FA /Multithreading در جاوا

Multithreading در جاوا

در گروه منتشر شد

معرفی

قبل از یادگیری در مورد موضوعات جاوا، بیایید به آینده نزدیک نگاه کنیم. تصور کنید رزومه خود را ارسال کرده اید و مصاحبه ای داشته اید. شما و ده ها تن از همکاران آینده برای کار در یک شرکت بزرگ نرم افزار دعوت شده اید. در میان مشکلات دیگر، باید اسناد کاغذی را برای استخدام به یک کارمند خسته از منابع انسانی ارائه دهید.
Multithreading در جاوا - 1
برای تسریع روند، متقاضیان این موقعیت را می توان به دو گروه تقسیم کرد و بین دو مدیر منابع انسانی (در صورت وجود در شرکت) تقسیم کرد. در نتیجه به دلیل کار طراحی موازی، روند را تسریع می کنیم .
Multithreading در جاوا - 2
اگر فقط یک افسر پرسنل در شرکت وجود دارد، پس باید به نحوی از آن خارج شوید. به عنوان مثال، می توانید دوباره همه را به دو گروه تقسیم کنید، به عنوان مثال با دختران و پسران به نوبت مصاحبه کنید.
Multithreading در جاوا - 3
یا طبق اصل دیگری: از آنجایی که افراد در گروه پایین تر هستند، دو دختر را به جای یک پسر جایگزین می کنیم.
Multithreading در جاوا - 4
این روش سازماندهی کار را چند رشته ای می نامند . افسر HR خسته ما به گروه های مختلف تغییر می کند تا کارمند بعدی را از آنها استخدام کند. شاید یازده گروه و چهار افسر پرسنل وجود داشته باشد. در این حالت، پردازش چند رشته ای به صورت موازی توسط چندین HR رخ می دهد که می توانند نفر بعدی را از هر گروهی برای پردازش اسناد خود ببرند.

فرآیندها

فرآیند ( فرآیند ) در این مورد سازماندهی کار دریافت اسناد خواهد بود. در یک سازمان، چندین فرآیند قابل تشخیص است: حسابداری، توسعه نرم افزار، جلسات با مشتریان، عملیات انبار و غیره. فرآیندها از یکدیگر جدا هستند: افسران منابع انسانی به پایگاه داده حسابداری دسترسی ندارند و مدیران خدمات مشتری در اطراف انبار کار نمی کنند. اگر فرآیندی نیاز به دسترسی به منابع شخص دیگری دارد، لازم است ارتباطات بین فرآیندی برقرار شود: یادداشت ها، جلسات مشترک.

جریان ها

کار در یک فرآیند به رشته ها ( java thread) سازماندهی می شود. برای بخش منابع انسانی، جریان سازماندهی کار برای خدمت به یک گروه است. در همان تصویر اول یک جریان وجود دارد، در سه تصویر بعدی دو جریان وجود دارد. در این فرآیند، موضوعات را می توان به صورت موازی اجرا کرد - دو افسر منابع انسانی دو یا چند گروه از کارمندان آینده را می پذیرند. تعامل افسران پرسنل با گروه ها - پردازش رشته ها در یک فرآیند - همگام سازی نخ نامیده می شود . نقشه های طراحی دو گروه توسط یک افسر پرسنل روش های یونیفرم (دختر - پسر - دختر - پسر) و با اولویت های مختلف (دو دختر متناوب با یک پسر) را نشان می دهد. موضوعات به منابع فرآیندی که به آن تعلق دارند دسترسی دارند: به گروه های افسر منابع انسانی نمونه هایی از فرم های درخواست، قلم هایی برای پر کردن اسناد داده می شود. اما اگر جریان ها با چیزهای مشترک آنها تعامل داشته باشند، حوادث ممکن است. اگر افسر پرسنل از شما بخواهد که نام آخرین نفر در صف را فریاد بزنید، در مورد دو گروه، از قبل مطمئن نیست که نام زن را خواهد شنید یا نام مرد. چنین تضادهای دسترسی به داده ها، مسدود کردن و راه های حل آنها موضوع بسیار مهمی است.

حالات جریان

هر رشته در یکی از حالت های زیر است:
  • ایجاد شد ( New) - خط افسر منابع انسانی در حال آماده شدن است، مردم در حال سازماندهی هستند.
  • راه اندازی شد ( Runnable) - صف ما برای افسر منابع انسانی تشکیل شده است و در حال پردازش است.
  • مسدود شده ( Blocked) - آخرین مرد جوان در صف سعی می کند نامی را فریاد بزند، اما وقتی شنید که دختر گروه بعدی قبل از او شروع به انجام این کار کرده است، ساکت شد.
  • تکمیل شده ( Terminated) - کل صف توسط افسر منابع انسانی تکمیل شده است و نیازی به آن نیست.
  • Waiting( Waiting) - یک صف منتظر سیگنالی از طرف دیگر است.
سازماندهی نخ ها و تعامل آنها مبنای عملکرد مؤثر فرآیندها است.

بیایید به دنیای فناوری اطلاعات برگردیم

در قرن بیست و یکم، اجرای چند رشته ای و موازی مطرح شده است. از دهه 90 قرن گذشته، سیستم عامل های چندوظیفه ای ویندوز، مک او اس و لینوکس به طور محکم در رایانه های خانگی مستقر شده اند. اغلب می توانید چهار یا چند پردازنده هسته ای را در آنها پیدا کنید. تعداد بلوک های موازی کارت های گرافیک GPU قبلاً از هزار فراتر رفته است. برنامه های محبوب با در نظر گرفتن چند رشته ای (چند رشته ای) نوشته می شوند، به عنوان مثال، نسخه های مدرن نرم افزار برای پردازش گرافیک، ویدئو یا کار با مقادیر زیادی داده: Adobe Photoshop، WinRar، Mathematica، بازی های مدرن. چند رشته ای جاوا یک موضوع بسیار مهم، محبوب و پیچیده است. بنابراین، در دوره JavaRush وظایف زیادی برای درک آن وجود دارد. مثال‌های جاوا در چند رشته به شما کمک می‌کند تا بر ظرافت‌ها و ظرافت‌های اساسی این ناحیه تسلط پیدا کنید و کار رشته‌ها را همگام‌سازی کنید.

روند

Process نمونه ای در حال اجرا از برنامه ای است که سیستم عامل (OS) حافظه، زمان/هسته های پردازنده و منابع دیگر را به آن اختصاص داده است. مهم است که حافظه به طور جداگانه تخصیص داده شود؛ فضاهای آدرس فرآیندهای مختلف برای یکدیگر قابل دسترسی نیستند. اگر فرآیندها نیاز به برقراری ارتباط داشته باشند، می‌توانند با استفاده از فایل‌ها، لوله‌ها و سایر روش‌های ارتباط بین فرآیندی این کار را انجام دهند.

جریان

جاوا Thread(جریان). گاهی اوقات، برای جلوگیری از سردرگمی با سایر کلاس های جاوا Streamو موارد مشابه، رشته های جاوا اغلب به عنوان یک رشته ترجمه می شوند. آنها از منابع تخصیص یافته به یک فرآیند استفاده می کنند و روشی هستند که فرآیند اجرا می شود. رشته اصلی متد را اجرا می کند mainو خارج می شود. هنگامی که یک فرآیند اجرا می شود، رشته های اضافی (رشته های فرزند) می توانند ایجاد شوند. رشته های یک فرآیند می توانند داده ها را با یکدیگر مبادله کنند. جاوا چند رشته ای نیاز به همگام سازی داده ها دارد، این را فراموش نکنید. در جاوا، یک فرآیند زمانی خاتمه می یابد که آخرین رشته آن به پایان برسد. برای کارهای پس‌زمینه، می‌توان یک رشته را به‌عنوان یک شبح ( ) شروع کرد daemon، تفاوت آن با نمونه معمولی این است که وقتی تمام غیر daemonرشته‌های فرآیند خاتمه می‌یابند، آنها به اجبار خاتمه می‌یابند.

اولین برنامه چند رشته ای

بیش از نیم دوجین راه برای ایجاد موضوعات وجود دارد که در دوره JavaRush آنها را به تفصیل بررسی خواهیم کرد. ابتدا با یکی از پایه ها آشنا می شویم. یک کلاس خاص وجود دارد که Threadدر روش run()آن باید کدی بنویسید که منطق برنامه را پیاده سازی کند. پس از ایجاد یک موضوع، می توانید آن را با فراخوانی شروع کنید start(). بیایید یک برنامه آزمایشی بنویسیم که نمونه ای از چند رشته ای جاوا را پیاده سازی کند.
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
Multithreading در جاوا موضوعی پیچیده و چندوجهی است. توانایی نوشتن کد با استفاده از محاسبات موازی، چندوظیفه ای و چند رشته ای به شما کمک می کند تا به طور موثر وظایف را روی پردازنده ها و خوشه های چند هسته ای مدرن متشکل از بسیاری از رایانه ها پیاده سازی کنید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION