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