SnuviScheduler.java 3.0 KB

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