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 هسته منطقی این زمان ثبت شده است، البته که با تفاوت در نوع الگوریتم محاسباتی ویا همچنین در نوع پردازشگر این زمان تغییر خواهد کرد
موفق باشید