**برای این سوال، نسخهی جاوای شما باید ۱۷ باشد.**
----------
![پردازنده](https://quera.org/qbox/view/sMwR5ryPs6/E.png)
شما به زودی قصد دارید که با یکی از بزرگترین شرکتها در حوزه ساخت تراشه و پردازندههای کامپیوتری همکاری کنید. آنها برای ارزیابی شما تسکی را میدهند. اگر در این تسک موفق شوید، در این شرکت استخدام خواهید شد. آنها از شما میخواهند تا سیستم ابتدایی پردازندههای آنها را طراحی کنید. جزئیات این تسک در ادامه آمده است.
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/contest/assignments/73613/download_problem_initial_project/253332/) دانلود کنید. ساختار فایلهای پروژه بهصورت زیر است:
```java
index
├── Core.java
├── Processor.java
├── SelectStrategy.java
├── Task.java
└── Type.java
```
همانطور که در ساختار فایلهای اولیه مشاهده میکنید، شما با چندین کلاس مرتبط با پردازنده سر و کار دارید. کلاس `Task` دقیقا تسکهایی است که به پردازنده شما وارد میشود و شما باید آنها را مدیریت کنید. هر تسک نوعی دارد که توسط `enum` با نام `Type` مشخص میشود. از سوی دیگر، کلاس `Core`، هر هسته از پردازنده شما را مشخص میکند که میتواند فقط انواع خاصی از تسکها را هندل کند که با ویژگی(property) `types` مشخص میشود. مقدار لود یا همان تعداد تسکی که هر هسته در حال پردازش دارد نیز با `currentLoad` مشخص میشود.
در این ساختار، رابط (Interface) `SelectStrategy` نیز به چشم میخورد که استراتژیهای مختلف انتخاب هسته پردازنده برای انجام تسک را مشخص میکند.
شما باید کلاس `Processor` را به همراه سه کلاس دیگر، مطابق با جزئیاتی که در ادامه ذکر میشود، کامل و ارسال کنید.
## کلاس `Processor`
اولین کلاسی که باید تکمیل کنید کلاس `Processor` است. این کلاس اطلاعات هستهها را نگه میدارد و وظیفه مدیریت تسکها را برعهده دارد. در اولین گام شما باید سه ویژگی زیر را ایجاد کنید:
| نام | نوع |
|:----------:|:------------------:|
| cores | `List<Core>` |
| tasks | `Queue<Task>` |
| selectStrategy | `SelectStrategy` |
همه ویژگیهای این کلاس باید دارای متدهای `getter` و `setter` با نام پیشفرض در جاوا باشد. علاوه بر این متدها، شما باید متدهای زیر را نیز در این کلاس ایجاد کنید:
متد `addCore`: این متد، هسته ورودی را به لیست هستههای این پردازنده اضافه میکند.
متد `addTask`: این متد، تسک ورودی را به صف تسکها اضافه میکند.
**توجه کنید** که در این کلاس، به محض اضافه شدن تسک به صف تسکها، فرایند انتخاب یک هسته آغاز و تسک برای انجام به یک هسته داده میشود.
## فرایند انتخاب یک هسته از پردازنده
همانطور که گفته شد، کلاس `Processor` دارای ویژگی با نام `selectStrategy` است که نگهدارنده استراتژی انتخاب یک هسته است. شما باید سه استراتژی را که در ادامه ذکر میشود را پیادهسازی کنید:
استراتژی `RandomStrategy`: این استراتژی، یک هسته را به صورت رندوم انتخاب و برمیگرداند.
استراتژی `LeastLoadStrategy`: در این استراتژی، هستهای که کمترین لود را دارد انتخاب و برگردانده میشود.
استراتژی `RoundRobinStrategy`: این استراتژی، با استفاده از الگوریتم **روند رابین (Round Robin)** یک هسته را انتخاب و برمیگرداند. در این استراتژی تسکها برای اجرا، به صورت چرخشی به هستههای پردازنده داده میشود.
**دقت کنید** که هر هسته فقط میتواند انواع خاصی از تسکها را پردازش کند.
# مثال
مثالهایی به صورت تست نمونه در اختیار شما قرار داده شده است که میتوانید از آنها کمک بگیرید. به عنوان مثال به مورد زیر دقت کنید:
```java
Processor processor = new Processor();
processor.addCore(new Core(1, List.of(Type.IO, Type.NETWORK)));
processor.addCore(new Core(2, List.of(Type.IO)));
processor.addCore(new Core(3, List.of(Type.STORAGE)));
processor.setSelectStrategy(new LeastLoadStrategy());
processor.addTask(new Task(1, Type.IO));
```
در این نمونه تسک با آیدی `1` به اولین هسته یعنی هسته با آیدی `1`داده میشود.
# نکات
+ شما فقط مجاز به اعمال تغییرات در کلاسهای `Core` و `Processor` به همراه سه کلاسی که باید ایجاد کنید، هستید.
+ حتما باید برای پیادهسازی استراتژیهای انتخاب از اینترفیس `SelectStrategy` استفاده کنید.
+ **دقت کنید** که ساختار ابتدایی کلاسها را تغییر ندهید.
# آنچه باید آپلود کنید
پس از پیادهسازی موارد خواستهشده، فقط فایل همه این کلاسها را زیپ کرده و آپلود کنید.