Advertisement
Sothian

SJF

Jun 4th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.92 KB | None | 0 0
  1. /////////////////////////////////// MAIN //////////////////////////////////////////
  2. import CPU.*;
  3. import Localization.English;
  4. import Localization.Locale;
  5. import Localization.Polish;
  6.  
  7. import java.awt.image.AreaAveragingScaleFilter;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.Random;
  11.  
  12. public class Main {
  13.  
  14. private static int procesorInc = 1;
  15.  
  16. public static CPU createCPU(Random generator, Locale jezyk, CPUResources zasoby) {
  17. return new CPU(procesorInc++, generator.nextInt(5)/ (1 + generator.nextInt(3)), jezyk,zasoby );
  18. }
  19.  
  20. public static void wykonuj(List<Task> taski, List<CPU> procesory) throws DeadlineException {
  21. int i = 0;
  22. for (Task zadanie : taski) {
  23. if(i == procesory.size())
  24. i = 0;
  25. procesory.get(i).dodaj(zadanie);
  26. ++i;
  27. }
  28.  
  29. for(CPU cpu : procesory) {
  30. while (cpu.saZadania()) {
  31. cpu.wykonajJedno();
  32. }
  33. }
  34. }
  35.  
  36. public static List<Task> generateTasks(Random generator) {
  37. List<Task> taski = new ArrayList<Task>();
  38. int size = 5 + generator.nextInt(5);
  39. for (int nr = 1; nr <= size; ++nr) {
  40. double czasStart = generator.nextInt(20);
  41. double deadline = 10 + czasStart + generator.nextInt(30);
  42. taski.add(new Task(nr, czasStart, deadline,generator.nextInt(20)));
  43. }
  44. return taski;
  45. }
  46.  
  47. public static void main(String[] args) {
  48. Random generator = new Random();
  49.  
  50. Locale jezyk = new Polish();
  51. // lub:
  52. // Locale jezyk = new English();
  53.  
  54. CPUResources zasoby = new CPUResources(jezyk,generator.nextInt(250));
  55. System.out.println(jezyk.get("RESOURCES_NUMBER") + ": " + zasoby.getRozmiar());
  56.  
  57. List<CPU> procesory = new ArrayList<CPU>();
  58. procesory.add(createCPU(generator,jezyk,zasoby));
  59.  
  60. List<Task> taski = generateTasks(generator);
  61.  
  62. boolean notFinished = true;
  63. while (notFinished) {
  64. try {
  65. wykonuj(taski, procesory);
  66. notFinished = false;
  67. } catch (DeadlineException e) {
  68. System.out.println(e.getMessage() + " | " + e.getZadanie().getNumer());
  69. procesory.add(createCPU(generator, jezyk, zasoby));
  70. for(CPU p : procesory) {
  71. p.clear();
  72. }
  73. notFinished = true;
  74. } finally {
  75. // test
  76. if(procesory.size() >= 5) {
  77. break;
  78. }
  79. }
  80. }
  81. }
  82. }
  83.  
  84. ////////////////////////////////////////// PACKAGE LOCALIZATION ///////////////////////////////////////////
  85. ////////////////////////////////////////// BASE //////////////////////////////////////////////////////////
  86. package Localization;
  87.  
  88. import java.util.Map;
  89.  
  90. abstract public class Base implements Locale {
  91.  
  92. private String name;
  93. private Map<String, String> map;
  94.  
  95. public Base(String name) {
  96. this.name = name;
  97. this.map = this.createMap();
  98. }
  99.  
  100. @Override
  101. public String get(String key) {
  102. return this.map.containsKey(key) ? this.map.get(key) : key;
  103. }
  104.  
  105. @Override
  106. public String getName() {
  107. return name;
  108. }
  109.  
  110. /**
  111. * @return Zwraca mape z unikalnymi kluczami, i z odpowiednimi dla jezyka wartosciami
  112. */
  113. abstract protected Map<String, String> createMap();
  114. }
  115. ////////////////////////////////////////////////// ENGLISH /////////////////////////////////////////////////
  116. package Localization;
  117.  
  118. import java.util.HashMap;
  119. import java.util.Map;
  120.  
  121. /**
  122. * W tym miejscu jest polimorfizm
  123. */
  124. public class English extends Base {
  125.  
  126. public English() {
  127. super("English");
  128. }
  129.  
  130. @Override
  131. protected Map<String, String> createMap() {
  132. Map<String, String> map = new HashMap<String, String>();
  133. map.put("LOCALE_NAME","Language name");
  134. map.put("RESOURCES_NUMBER","Number of resources");
  135. map.put("ERROR_DEADLINE", "[Error] Exceeded deadline time.");
  136. map.put("ERROR_LACK_OF_RESOURCES", "[Error] Lack of resources");
  137. map.put("ADDED_RESOURCES", "Added resources");
  138. map.put("ADDED_TASK", "Added (test/resources): ");
  139. map.put("EXECUTED","Executed: stratTime | realStart | End | Deadline");
  140. map.put("EXECUTED_TASK", "- [Task]: ");
  141. return map;
  142. }
  143. }
  144.  
  145. /////////////////////////////////////////////////// LOCALE ///////////////////////////////////////////////////
  146. package Localization;
  147.  
  148. public interface Locale {
  149.  
  150. /**
  151. * @return nazwa uzywanego jezyka
  152. */
  153. public String getName();
  154.  
  155. /**
  156. *
  157. * @param key unikalna nazwa wartosci jaka chcemy otrzymac
  158. * @return wartosc w ustawionym jezyku
  159. */
  160. public String get(String key);
  161. }
  162.  
  163. ///////////////////////////////////////////////////// POLISH ///////////////////////////////////////////////////////
  164. package Localization;
  165.  
  166. import java.util.HashMap;
  167. import java.util.Map;
  168.  
  169. /**
  170. * W tym miejscu jest polimorfizm
  171. */
  172. public class Polish extends Base {
  173.  
  174. public Polish() {
  175. super("Polish");
  176. }
  177.  
  178. @Override
  179. protected Map<String, String> createMap() {
  180. Map<String, String> map = new HashMap<String, String>();
  181. map.put("LOCALE_NAME","Nazwa jezyka");
  182. map.put("RESOURCES_NUMBER","Ilosc zasobow");
  183. map.put("ERROR_DEADLINE", "[Blad] Przekroczono czas deadline.");
  184. map.put("ERROR_LACK_OF_RESOURCES", "[Blad] Brakuje zasobow");
  185. map.put("ADDED_RESOURCES", "Dodano zasoby");
  186. map.put("ADDED_TASK", "Dodano(zadanie/zasoby): ");
  187. map.put("EXECUTED","Wykonano: czasStart | Start | End | Deadline");
  188. map.put("EXECUTED_TASK", "- [Zadanie]: ");
  189. return map;
  190. }
  191. }
  192.  
  193. /////////////////////////////////////////////////////// PACKAGE CPU //////////////////////////////////////////////////////
  194. /////////////////////////////////////////////////////// CPU //////////////////////////////////////////////////////
  195. package CPU;
  196.  
  197. import Localization.Locale;
  198.  
  199. import java.util.PriorityQueue;
  200.  
  201.  
  202. public class CPU {
  203.  
  204. private int numer;
  205. private double moc;
  206. private double czas;
  207. private Locale jezyk;
  208. private CPUResources zasoby;
  209. private PriorityQueue<Task> zadania;
  210.  
  211. public CPU(int numer, double moc, Locale jezyk, CPUResources zasoby) {
  212. this.numer = numer;
  213. this.moc = moc;
  214. this.jezyk = jezyk;
  215. this.zasoby = zasoby;
  216. this.czas = 0.0;
  217. this.zadania = new PriorityQueue<Task>();
  218. }
  219.  
  220. private double calcComplex(Task zadanie) {
  221. return zadanie.getRozmiarZadania() / moc;
  222. }
  223.  
  224. public void dodaj(Task zadanie) {
  225. try {
  226. zasoby.zajmij(zadanie.getRozmiarZadania());
  227. zadania.add(zadanie);
  228. System.out.println(jezyk.get("ADDED_TASK") + zadanie.getNumer() + "/" + zadanie.getRozmiarZadania());
  229. } catch (CPUException e) {
  230. System.out.println(e.getMessage());
  231. double dodano = zadanie.getRozmiarZadania()-zasoby.getRozmiar();
  232. zasoby.zwolnij(dodano);
  233. System.out.println(jezyk.get("ADDED_RESOURCES") + ": " + dodano);
  234. dodaj(zadanie);
  235. }
  236. }
  237.  
  238. public void wykonajJedno() throws DeadlineException {
  239. Task zadanie = zadania.peek();
  240. if(czas >= zadanie.getCzasStart()) {
  241. double realStart = this.czas;
  242. double realEnd = this.czas + calcComplex(zadanie);
  243.  
  244. // Przerwij jesli przekroczono deadline
  245. if(realEnd > zadanie.getDeadline()) {
  246. throw new DeadlineException(jezyk.get("ERROR_DEADLINE"), realEnd, zadanie);
  247. }
  248.  
  249. System.out.println(jezyk.get("EXECUTED_TASK") + zadanie.getCzasStart() + " | " + realStart + " | " + realEnd + " | " + zadanie.getDeadline());
  250.  
  251. // Zwolnienie zasobow
  252. zasoby.zwolnij(zadanie.getRozmiarZadania());
  253. zadania.poll();
  254. this.czas = realEnd;
  255. } else {
  256. this.czas += 1.0;
  257. }
  258. }
  259.  
  260. public Task getPierwszeZadanie() {
  261. return zadania.peek();
  262. }
  263.  
  264. public void clear() {
  265. zadania.clear();
  266. this.czas = 0.0;
  267. }
  268.  
  269. public double getCzas() {
  270. return czas;
  271. }
  272.  
  273. public boolean saZadania() {
  274. return !zadania.isEmpty();
  275. }
  276.  
  277. public int iloscZadan() {
  278. return zadania.size();
  279. }
  280. }
  281.  
  282. /////////////////////////////////////////////////////// CPUException//////////////////////////////////////////////////////
  283. package CPU;
  284.  
  285.  
  286. public class CPUException extends Exception {
  287. public CPUException(String message) {
  288. super(message);
  289. }
  290. }
  291.  
  292. /////////////////////////////////////////////////////// CPUResources //////////////////////////////////////////////////////
  293. package CPU;
  294.  
  295. import Localization.Locale;
  296.  
  297.  
  298. public class CPUResources extends Resource {
  299.  
  300. private Locale jezyk;
  301.  
  302. public CPUResources(Locale jezyk, double rozmiar) {
  303. super(rozmiar);
  304. this.jezyk = jezyk;
  305. }
  306.  
  307. public void zajmij(double rozmiar) throws CPUException {
  308. double pozostalo = this.getRozmiar() - rozmiar;
  309. if(pozostalo >= 0.0) {
  310. setRozmiar(pozostalo);
  311. } else {
  312. throw new CPUException(jezyk.get("ERROR_LACK_OF_RESOURCES"));
  313. }
  314. }
  315.  
  316. public void zwolnij(double rozmiar) {
  317. setRozmiar(this.getRozmiar() + rozmiar);
  318. }
  319. }
  320.  
  321. /////////////////////////////////////////////////////// DeadlineException//////////////////////////////////////////////////////
  322. package CPU;
  323.  
  324. public class DeadlineException extends CPUException {
  325. private double przewidywanyCzasZakonczenia;
  326. private Task zadanie;
  327. public DeadlineException(String message, double przewidywanyCzasZakonczenia, Task zadanie) {
  328. super(message);
  329. this.przewidywanyCzasZakonczenia = przewidywanyCzasZakonczenia;
  330. this.zadanie = zadanie;
  331. }
  332.  
  333. public double getPrzewidywanyCzasZakonczenia() {
  334. return przewidywanyCzasZakonczenia;
  335. }
  336.  
  337. public Task getZadanie() {
  338. return zadanie;
  339. }
  340. }
  341.  
  342. /////////////////////////////////////////////////////// Resource//////////////////////////////////////////////////////
  343. package CPU;
  344.  
  345.  
  346. public class Resource {
  347. private double rozmiar;
  348.  
  349. public Resource(double rozmiar) {
  350. this.rozmiar = rozmiar;
  351. }
  352.  
  353. public double getRozmiar() {
  354. return rozmiar;
  355. }
  356.  
  357. public void setRozmiar(double rozmiar) {
  358. this.rozmiar = rozmiar;
  359. }
  360. }
  361.  
  362. /////////////////////////////////////////////////////// Task//////////////////////////////////////////////////////
  363.  
  364. package CPU;
  365.  
  366.  
  367. public class Task implements Comparable<Task> {
  368.  
  369. private int numer;
  370. private Resource zasoby;
  371. private double czasStart;
  372. private double deadline;
  373.  
  374. public Task(int numer, double czasStart, double deadline, double rozmiar) {
  375. this.numer = numer;
  376. this.zasoby = new Resource(rozmiar);
  377. this.czasStart = czasStart;
  378. this.deadline = deadline;
  379. }
  380.  
  381. public double getRozmiarZadania() {
  382. return zasoby.getRozmiar();
  383. }
  384.  
  385. @Override
  386. public int compareTo(Task o) {
  387. if(getCzasStart() < o.getCzasStart()) {
  388. return -1;
  389. }
  390. if(getCzasStart() > o.getCzasStart()) {
  391. return 1;
  392. }
  393. if(getCzasStart() == o.getCzasStart()) {
  394. if(getDeadline() < o.getDeadline()) {
  395. return -1;
  396. }
  397. if(getDeadline() > o.getDeadline()) {
  398. return 1;
  399. }
  400. }
  401. return 0;
  402. }
  403.  
  404. public double getDeadline() {
  405. return deadline;
  406. }
  407.  
  408. public double getCzasStart() {
  409. return czasStart;
  410. }
  411.  
  412. public int getNumer() {
  413. return numer;
  414. }
  415. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement