Thread.hx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 function getThread(jt:java.lang.Thread):Thread
  7. {
  8. if (Std.is(jt, HaxeThread))
  9. {
  10. var t:HaxeThread = cast jt;
  11. return t.threadObject;
  12. }
  13. var ret = null;
  14. untyped __lock__(javaThreadToHaxe, {
  15. ret = javaThreadToHaxe.get(jt);
  16. if (ret == null)
  17. {
  18. ret = new Thread();
  19. javaThreadToHaxe.set(jt, ret);
  20. }
  21. });
  22. return ret;
  23. }
  24. private var messages:Deque<Dynamic>;
  25. function new()
  26. {
  27. this.messages = new Deque();
  28. }
  29. public function sendMessage(obj:Dynamic)
  30. {
  31. messages.add(obj);
  32. }
  33. public static function current():Thread
  34. {
  35. return getThread( java.lang.Thread.currentThread() );
  36. }
  37. public static function readMessage(block : Bool) : Dynamic
  38. {
  39. return current().messages.pop(block);
  40. }
  41. public static function create(fn:Void->Void):Thread
  42. {
  43. var ret = new Thread();
  44. var t = new HaxeThread(ret, fn);
  45. t.start();
  46. return ret;
  47. }
  48. }
  49. @:native('haxe.java.vm.HaxeThread')
  50. private class HaxeThread extends java.lang.Thread
  51. {
  52. public var threadObject(default, null):Thread;
  53. private var runFunction:Void->Void;
  54. @:overload override public function run():Void
  55. {
  56. runFunction();
  57. }
  58. public function new(hxThread:Thread, run:Void->Void)
  59. {
  60. super();
  61. threadObject = hxThread;
  62. runFunction = run;
  63. }
  64. }