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
|
package sys.thread;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition as NativeCondition;
@:access(sys.thread.Mutex)
@:coreApi
@:native('haxe.java.vm.Condition')
class Condition {
final lock:ReentrantLock;
final native:NativeCondition;
public function new():Void {
this.lock = new ReentrantLock();
this.native = lock.newCondition();
}
public function acquire():Void {
lock.lock();
}
public function tryAcquire():Bool {
return this.lock.tryLock();
}
public function release():Void {
lock.unlock();
}
// without the @:native, you get "java.lang.VerifyError: class sys.thread.Condition overrides final method java.lang.Object.wait()V" on jvm
// and "wait() in Condition cannot override wait() in Object" from javac
@:native("waitOn")
public function wait():Void {
native.await();
}
public function signal():Void {
native.signal();
}
public function broadcast():Void {
native.signalAll();
}
}
|