آشنایی با مفهوم Concurrency در زبان برنامه‌نویسی جاوا


یکی از تفاوت‌های عمدۀ خانم‌ها و آقایان به میزان توانایی آن‌ها در انجام کارهای به صورت اصطلاحاً Concurrent یا «هم‌زمان» مربوط می‌شود که پیش از توضیح پیرامون این مسئله، دو تصویر زیر را با یکدیگر مقایسه می‌کنیم:

در تصویر فوق، آقایی را می‌بینیم که قصد دارد تا چند کار را به صورت هم‌زمان انجام دهد و همان‌طور که چهرۀ وی نشان می‌دهد، کاملاً مشخص است که تا چه حدی در انجام این کار موفق است! در واقع، علت عدم توانایی آقایان در انجام چندین کار به صورت هم‌زمان در این است که اکثر ایشان توانایی تمرکز روی تنها یک یا دو کار متفاوت را به صورت هم‌زمان دارند و این در صورتی است که اگر بیش از یک کار به ایشان تفویض شود، کیفیت کارشان به مراتب پایین‌تر می‌آید. حال با مد نظر قرار دادن تصویر زیر می‌بینیم که این وضعیت در مورد خانم‌ها به چه صورت است:

همان‌طور که در تصویر فوق می‌بینیم، وی با رضایت کامل از طریق تلفن به راهنمایی فرد پشت خط می‌پردازد، کار ارباب رجوع را انجام می‌دهد، نوشیدنی میل می‌کند و مهم‌تر از همه آخرین پیا‌م‌های که از طریق پیام کوتاه برای او ارسال می‌شوند را نیز از دست نمی‌دهد و اگر به چهرۀ این خانم توجه کنیم، می‌بینیم که او با رضایت کامل همۀ این کارها را به صورت هم‌زمان انجام می‌دهد و جالب اینجا است که هر یک از کارها با نهایت دقت و کیفیت انجام می‌شوند به طوری که توجه به یک کار او را از انجام کار دیگر باز نمی‌دارد.

زبان برنامه‌نویسی جاوا نیز قابلیت انجام تَسک‌ها به صورت Concurrent را دارا است. در حقیقت، زبان جاوا از همان ابتدای شکل‌گیری دارای قابلیت Concurrency بود. به عبارت دیگر، طراحان این زبان برنامه‌نویسی قصد داشتند تا زبانی را توسعه دهند که امکان اجرای چندین تَسک را به طور هم‌زمان به برنامه‌نویسان و توسعه‌دهندگان بدهد (لازم به یادآوری است که در نسخۀ جاوای 5 به بعد، کلاس‌ها و متدهای از پیش تعریف‌شدۀ پیشرفته‌ای برای استفاده از مفهوم Concurrency به این زبان اضافه شده‌اند.)

به طور کلی، مفهوم کانکارنسی در زبان جاوا منجر به توسعۀ برنامه‌هایی می‌گردد که تعامل بیشتری با کاربر دارند. برای مثال، فرض می‌کنیم که برنامه‌ای طراحی کرده‌ایم که می‌باید فایلی را از طریق شبکه دانلود کند و پس از تکمیل فایل آن را پخش نماید که در چنین شرایطی چنانچه برنامۀ مورد نظر قابلیت اجرا به صورت کانکارنت را نداشته باشد، می‌باید مدت زمان قابل‌توجهی را بسته به حجم فایل منتظر دانلود آن مانده سپس فایل مذکور را پخش نماید اما اگر برنامۀ مد نظر را به صورت کانکارنت پیاده‌سازی نماییم، این دو کار به صورت هم‌زمان انجام می‌شود بدین معنی که در هنگام دانلود شدن فایل، برنامه بخش دانلودشده از آن را پخش کرده و بدین ترتیب تجربۀ کاربری خوبی برای کاربران رقم می‌خورد.

به طور کلی، تمامی برنامه‌های نوشته‌شده با زبان جاوا حداقل دارای یک تِرِد هستند که تحت عنوان Main Thread یا «تِرِد اصلی» شناخته می‌شود و این تِرِد اصلی می‌تواند دیگر تِرِدها را در خود جای دهد و همان‌طور که در آموزش‌های پیشین در مباحث مرتبط با تِرِدها دیدیم، می‌توانیم چندین تِرِد را در متد ()main ایجاد کنیم به طوری که متد ()main را می‌توان به عنوان «تِرِد اصلی» برنامه خود نیز در نظر بگیریم.

حال فرض کنیم که برنامه‌ای داریم که به صورت کانکارنت اجرا می‌شود. به عبارت دیگر، این برنامه حاوی چندین تِرِد است که هر کدام وظیفۀ انجام تَسک خاصی را بر عهده دارند که در چنین شرایطی می‌باید سازوکاری داشته باشیم که از تداخل عملکرد تِرِدها جلوگیری به عمل آورد و برای رفع مسائلی از این دست به مفهومی تحت عنوان Synchronization نیاز داریم که معادل فارسی این واژه «هم‌زمانی» می‌باشد. در واقع، هم‌زمانی مابین تِرِدها این اطمینان را به ما می‌دهد که مثلاً زمانی که یک تِرِد در حال ویرایش یک فایل و یا ایجاد یک فایل جدید است، سایر تِرِدها امکان دسترسی به آن فایل را نداشته و می‌باید منتظر بمانند تا کار تِرِد مذکور به پایان برسد. در واقع، علت به‌کارگیری مفهوم Synchronization نیز این است که هر دو تِرِد به اطلاعات یکسانی دسترسی دارند و چنانچه امکان دخالت در کار یکدیگر داشته باشند، می‌باید انتظار مشکلاتی را در برنامۀ خود داشته باشیم.


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
nahid
nahid
۱۳۹۵/۰۹/۲۰
عالی..............
M-Yall
M-Yall
۱۳۹۵/۰۴/۲۹
کاش این بخش هم مثالی براش میذاشتین.کنجکاو بودم Concurrency تو یه پروژه ی ابتدایی چجوریه
کاربر میهمان
کیوانمن یک کاربر مهمان هستم
۱۳۹۵/۰۱/۲۱
بعد از اون همه بخش سخت و زیاد تو این فصل دیگه مغزم داشت اتیش میگرفت که این بخش مثل آب شد براش