How To use Fork Join Task Algorithm in Java

How To use Fork Join Task Algorithm in Java

از پرکابردترین الگوریتم های برنامه نویسی چند نخی و عملیاتهای همزمانی الگوریتم تقسیم وغلبه می باشد، به همین علت کتابخانه های مختلفی در زبانهای برنامه نویسی مختلف جهت پیاده سازی این الگوریتم ساخته شده اند

با توجه به این مقدمه کوتاه، نحوه پیاده سازی این الگوریتم را در زبان جاوا در نسخه 7 به بعد باهم پیاده خواهیم کرد

ایجاد شده است که نحوه استفاده از کلاسهای این فریم وورک را ForkJoinTask در جاوا فریم وورکی به نام

آموزش خواهم داد


همانطور که مشاهد میکنید با استفاده از کلاس فوق یک آرایه داریم که به صورت ژنریک تعریف شده است بنابراین میتوان هر نوع داده ای را تعریف کنید، وما دراین برنامه از نوع دابل استفاده کردیم با پنج میلیون عضو که تابع موثر برای این برنامه مقدار قدر مطلق را برای این پنج میلیون عضو محاسبه خواهد کرد. توجه داشته باشید که در این برنامه از فانکشن رفرنس ها که در جاوای 8 اضافه شده است استفاده کردیم

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

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

توجه داشته باشید که سناریوی فوق را میتوان بازهم بهینه تر نوشت، در صورتی که پیشنهاد یا انتقادی داشتید خوشحال خواهم شد که مطرح کنید

بنابراین با توجه به نوع کلاسهایی که تعریف کردیم به راحتی شما میتوانید الگوریتم محاسبه عضوهای آرایه ویا یک کانتینر لیست را به راحتی تغییر بدید و کاری با پیاده سازی نخواهید داشت

private Function<Double,Double> myFunction = Math::sqrt ;

فقط کافی این الگوریتم را تغییر بدید و خودتون تابع محاسباتی بنویسید

 private static Double[] data;

ویا نوع داده مورد نظر خودتون را تعریف کنید

زمانی که این کلاس را اجرا کنید متوجه خواهید شد که به قدری بازدهی بالاست که برای محاسبه قدرمطلق پنج میلیون عضو که از نوع

QWord Float

هستند همانطور که میدانید نوع داده فلوت به این علت که در یک کنترل یونیت مشخص دیگر وهمچنین در ثباتهای مختلفی محاسبه میشود کمی بازدهی پایینتری نسبت به سایر نوع داده ها در معماری پردازشگر را دارد، با توجه به این توضیحات زمان محاسبه برای این برنامه کمتر از 2 ثانیه می باشد، البته در یک پردازشگر معمولی با 2 هسته فیزیکی و4 هسته منطقی این زمان ثبت شده است، البته که با تفاوت در نوع الگوریتم محاسباتی ویا همچنین در نوع پردازشگر این زمان تغییر خواهد کرد

موفق باشید

To view or add a comment, sign in

More articles by Farhad Shiri

  • مقدمه ای از دی اسمبل کردن و مقایسه با دی کامپایلرها

    یک دی کامپایلر فایلهای باینری اجرایی را به صورت قابل خواندن نشان می دهد. به عبارت دقیق تر ، کد دودویی را به متن تبدیل…

  • معماری پردازشگرها کوانتومی

    زبان برنامه نویسی نوعی زبان دستور مدار می باشد که برای رایانه قابل فهم است. زبان برنامه نویسی مکانیزمی ساخت یافته برای…

  • Introduction to TPL Dataflow

    Introductory Examples One of the most common ways into TPL Dataflow is the ActionBlock<TInput> class. This class can be…

  • POSIX IPC-Message Queue in Linux

    یکی از تکنیکهایی که در دنیا برنامه نویسی از اهمیت زیادی برخوردار می باشد، مبحث ارتباطات بین پردازشی در هسته سیستم عامل…

    9 Comments
  • Optimizing and Safety Programming in C ++

    با توجه به اهمیت امنیت نرم افزار، شرکت های بزرگ دنیا به ارائه راهکارهایی چون طراحی زبانها و محیط های برنامه نویسی و…

    5 Comments
  • Device console management in Linux(TTY)

    همانطور که مستحضر هستید، یکی از بلاک دیوایس ها پر کاربرد در لینوکس ترمینال هست یا به تعبیری کنسول هایی که برای اجرای…

    2 Comments
  • Use reflection to dynamic Content Values When using SQLite

    من همیشه با اینکه یک کار تکراری انجام بدم و یک Map Content Values درست کنم برای عملیاتهای Insert / Update برای جداول تو…

  • How to make Shared Library in linux OS with C++

    ابتدا باید در برنامه ای که قصد دارید آن را به کتابخانه عمومی تبدیل کنید، یک رابط مناسب Factory Method برای لینک در زمان…

    5 Comments
  • Inline Assembly code VS Compiler Assembly code

    با سلام قبلا یک مقدمه کوتاهی درباره نوشتن کدهای بهینه با استفاده از بلاک کدهای اسمبلی در زبان سی پلاس پلاس در لینک زیر…

    3 Comments
  • Programmer Tools For Windows

    معمولا هر برنامه نویسی فارغ از اینکه در چه سطحی برنامه نویسی میکنه، به ابزارهایی نیاز داره که با کمک این ابزار نرم…

    1 Comment

Explore content categories