SnuviScheduler.java 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 stop() {
  19. noAdding = true;
  20. long endTime = System.nanoTime() + 60_000_000_000l;
  21. logger.print("Waiting until end of synchronized tasks ...");
  22. while(!tasks.isEmpty() && System.nanoTime() < endTime) {
  23. tick(1000);
  24. }
  25. logger.print("Waiting until end of asynchronous tasks ...");
  26. while(worker.hasWork() && System.nanoTime() < endTime) {
  27. try {
  28. Thread.sleep(250);
  29. } catch(InterruptedException ex) {
  30. }
  31. }
  32. worker.stop();
  33. logger.print("the scheduler is now stopped");
  34. }
  35. public void scheduleRepeatingTask(Runnable r, long ticks, long rtimer) {
  36. if(noAdding) {
  37. return;
  38. }
  39. tasks.add(new SnuviTask(r, ticks, rtimer));
  40. }
  41. @Override
  42. public void scheduleTask(Runnable r, long delay) {
  43. scheduleRepeatingTask(r, delay, 0);
  44. }
  45. public void tick() {
  46. tick(1);
  47. }
  48. private void tick(int ticks) {
  49. System.out.println("Ticking scheduler");
  50. Iterator<SnuviTask> iter = tasks.iterator();
  51. long endTime = System.currentTimeMillis() + 25;
  52. while(iter.hasNext()) {
  53. if(System.currentTimeMillis() > endTime) {
  54. logger.print("scheduler has run longer than 25 ms");
  55. break;
  56. }
  57. SnuviTask task = iter.next();
  58. try {
  59. if(task.tick(ticks, noAdding)) {
  60. iter.remove();
  61. }
  62. } catch(Exception ex) {
  63. logger.print("scheduler exception - task will be removed", ex, null, null, null, null);
  64. iter.remove();
  65. }
  66. }
  67. System.out.println("Finished ticking scheduler");
  68. }
  69. public void scheduleAsyncTask(Runnable r) {
  70. if(noAdding) {
  71. return;
  72. }
  73. worker.add(r);
  74. }
  75. public boolean hasAsyncWork() {
  76. return worker.hasWork();
  77. }
  78. }