Thread.hx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package java.vm;
  2. import java.Lib;
  3. @:native('haxe.java.vm.Thread') class Thread
  4. {
  5. @:private static var javaThreadToHaxe = new haxe.ds.WeakMap<java.lang.Thread, java.vm.Thread>();
  6. @:private static var mainJavaThread = java.lang.Thread.currentThread();
  7. @:private static var mainHaxeThread = {
  8. var ret = new Thread();
  9. javaThreadToHaxe.set(mainJavaThread, ret);
  10. ret;
  11. };
  12. private static function getThread(jt:java.lang.Thread):Thread
  13. {
  14. if (Std.is(jt, HaxeThread))
  15. {
  16. var t:HaxeThread = cast jt;
  17. return t.threadObject;
  18. }
  19. else if (jt == mainJavaThread)
  20. {
  21. return mainHaxeThread;
  22. }
  23. else
  24. {
  25. var ret = null;
  26. untyped __lock__(javaThreadToHaxe, {
  27. ret = javaThreadToHaxe.get(jt);
  28. if (ret == null)
  29. {
  30. ret = new Thread();
  31. javaThreadToHaxe.set(jt, ret);
  32. }
  33. });
  34. return ret;
  35. }
  36. }
  37. private var messages:Deque<Dynamic>;
  38. function new()
  39. {
  40. this.messages = new Deque();
  41. }
  42. public function sendMessage(obj:Dynamic)
  43. {
  44. messages.add(obj);
  45. }
  46. public static function current():Thread
  47. {
  48. return getThread( java.lang.Thread.currentThread() );
  49. }
  50. public static function readMessage(block : Bool) : Dynamic
  51. {
  52. return current().messages.pop(block);
  53. }
  54. public static function create(fn:Void->Void):Thread
  55. {
  56. var ret = new Thread();
  57. var t = new HaxeThread(ret, fn);
  58. t.start();
  59. return ret;
  60. }
  61. }
  62. @:native('haxe.java.vm.HaxeThread')
  63. private class HaxeThread extends java.lang.Thread
  64. {
  65. public var threadObject(default, null):Thread;
  66. private var runFunction:Void->Void;
  67. @:overload override public function run():Void
  68. {
  69. runFunction();
  70. }
  71. public function new(hxThread:Thread, run:Void->Void)
  72. {
  73. super();
  74. threadObject = hxThread;
  75. runFunction = run;
  76. setDaemon(true);
  77. }
  78. }