SnuviScheduler.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package me.km.scheduler;
  2. import java.util.ArrayList;
  3. import java.util.ConcurrentModificationException;
  4. import java.util.HashMap;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.ScheduledExecutorService;
  7. import java.util.concurrent.TimeUnit;
  8. import me.hammerle.code.ISnuviScheduler;
  9. import me.km.api.Module;
  10. import net.minecraft.util.text.TextFormatting;
  11. import net.minecraftforge.fml.relauncher.Side;
  12. import net.minecraftforge.fml.relauncher.SideOnly;
  13. @SideOnly(Side.SERVER)
  14. public class SnuviScheduler extends Module implements ISnuviScheduler
  15. {
  16. private boolean checker;
  17. private int counter;
  18. private final ArrayList<SnuviTask> addQueue;
  19. private final ArrayList<Integer> removeQueue;
  20. private final HashMap<Integer, SnuviTask> tasks;
  21. public SnuviScheduler(String mname, String prefix, TextFormatting color)
  22. {
  23. super(mname, prefix, color);
  24. counter = 0;
  25. tasks = new HashMap<>();
  26. addQueue = new ArrayList<>();
  27. removeQueue = new ArrayList<>();
  28. }
  29. public void cancelTask(int id)
  30. {
  31. removeQueue.add(id);
  32. }
  33. public int scheduleRepeatingTask(Runnable r, long ticks, long rtimer)
  34. {
  35. counter++;
  36. addQueue.add(new SnuviTask(counter, r, ticks, rtimer));
  37. return counter;
  38. }
  39. @Override
  40. public int scheduleTask(Runnable r, long delay)
  41. {
  42. return scheduleRepeatingTask(r, delay, 0);
  43. }
  44. @Override
  45. public int scheduleTask(Runnable r)
  46. {
  47. return scheduleTask(r, 0);
  48. }
  49. public void tick()
  50. {
  51. try
  52. {
  53. if(!removeQueue.isEmpty())
  54. {
  55. removeQueue.forEach(i -> tasks.remove(i));
  56. removeQueue.clear();
  57. }
  58. if(!addQueue.isEmpty())
  59. {
  60. addQueue.forEach(task -> tasks.put(task.getId(), task));
  61. addQueue.clear();
  62. }
  63. checker = false;
  64. long l = System.currentTimeMillis();
  65. tasks.values().removeIf(task ->
  66. {
  67. if(checker)
  68. {
  69. return false;
  70. }
  71. if(System.currentTimeMillis() - l > 25)
  72. {
  73. checker = true;
  74. this.sendWarningToConsole("Der Scheduler ist länger als 25 ms gelaufen.");
  75. return false;
  76. }
  77. return task.tick();
  78. });
  79. }
  80. catch(ConcurrentModificationException ex)
  81. {
  82. this.sendWarningToConsole(ex.toString());
  83. }
  84. }
  85. public static void scheduleAsyncTask(Runnable r)
  86. {
  87. scheduleAsyncTask(r, 1);
  88. }
  89. public static void scheduleAsyncTask(Runnable r, long ticks)
  90. {
  91. ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
  92. executor.schedule(r, ticks * 50, TimeUnit.MILLISECONDS);
  93. executor.shutdown();
  94. }
  95. }