SnuviScheduler.java 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package me.km.scheduler;
  2. import java.util.Iterator;
  3. import java.util.concurrent.ConcurrentLinkedQueue;
  4. import me.hammerle.snuviscript.code.ISnuviLogger;
  5. import me.hammerle.snuviscript.code.ISnuviScheduler;
  6. import net.minecraftforge.api.distmarker.Dist;
  7. import net.minecraftforge.api.distmarker.OnlyIn;
  8. @OnlyIn(Dist.DEDICATED_SERVER)
  9. public class SnuviScheduler implements ISnuviScheduler {
  10. private final ISnuviLogger logger;
  11. private final ConcurrentLinkedQueue<SnuviTask> tasks = new ConcurrentLinkedQueue<>();
  12. private final AsyncWorker worker = new AsyncWorker();
  13. private boolean noAdding = false;
  14. public SnuviScheduler(ISnuviLogger logger) {
  15. this.logger = logger;
  16. worker.start();
  17. }
  18. public void kill() {
  19. for(SnuviTask task : tasks) {
  20. System.out.println(task.getName() + " " + task.isKillable());
  21. }
  22. tasks.removeIf(task -> task.isKillable());
  23. }
  24. public void stop() {
  25. noAdding = true;
  26. long endTime = System.nanoTime() + 60_000_000_000l;
  27. logger.print("Waiting until end of synchronized tasks ...");
  28. while(!tasks.isEmpty() && System.nanoTime() < endTime) {
  29. tick(1000);
  30. }
  31. logger.print("Waiting until end of asynchronous tasks ...");
  32. while(worker.hasWork() && System.nanoTime() < endTime) {
  33. try {
  34. Thread.sleep(250);
  35. } catch(InterruptedException ex) {
  36. }
  37. }
  38. worker.stop();
  39. logger.print("the scheduler is now stopped");
  40. }
  41. public void scheduleRepeatingTask(String name, boolean killable, Runnable r, long ticks,
  42. long rtimer) {
  43. if(noAdding) {
  44. return;
  45. }
  46. tasks.add(new SnuviTask(name, killable, r, ticks, rtimer));
  47. }
  48. public void scheduleRepeatingTask(String name, Runnable r, long ticks, long rtimer) {
  49. scheduleRepeatingTask(name, false, r, ticks, rtimer);
  50. }
  51. @Override
  52. public void scheduleTask(String name, Runnable r, long delay) {
  53. scheduleRepeatingTask(name, true, r, delay, 0);
  54. }
  55. public void tick() {
  56. tick(1);
  57. }
  58. private void tick(int ticks) {
  59. Iterator<SnuviTask> iter = tasks.iterator();
  60. long endTime = System.currentTimeMillis() + 25;
  61. while(iter.hasNext()) {
  62. if(System.currentTimeMillis() > endTime) {
  63. logger.print("scheduler has run longer than 25 ms");
  64. break;
  65. }
  66. SnuviTask task = iter.next();
  67. try {
  68. if(task.tick(ticks, noAdding)) {
  69. iter.remove();
  70. }
  71. } catch(Exception ex) {
  72. logger.print("scheduler exception - task will be removed", ex, null, null, null,
  73. null);
  74. ex.printStackTrace();
  75. iter.remove();
  76. }
  77. }
  78. }
  79. public void scheduleAsyncTask(Runnable r) {
  80. if(noAdding) {
  81. return;
  82. }
  83. worker.add(r);
  84. }
  85. public boolean hasAsyncWork() {
  86. return worker.hasWork();
  87. }
  88. }