Created
March 11, 2014 05:01
-
-
Save suxue/9479756 to your computer and use it in GitHub Desktop.
#jjs :call Java from js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// mutex implemented by synchornized keyword | |
var Mutex = Packages.Mutex; | |
// Java native mutex | |
var Lock = java.util.concurrent.locks.ReentrantLock; | |
var Thread = java.lang.Thread | |
var mutex = new Mutex(); // or = new Lock(); | |
var sum = 0; | |
function adder(c) { | |
return function () { | |
while (c > 0) { | |
c -= 1; | |
mutex.lock(); | |
sum += 1; | |
mutex.unlock(); | |
} | |
} | |
} | |
function newThread(func, name) { | |
return new Thread(function run() { | |
print("thread " + name + " started"); | |
func(); | |
print("thread " + name + " ended"); | |
}); | |
} | |
var t1 = newThread(adder(10), "t1"); | |
var t2 = newThread(adder(100), "t2"); | |
var t3 = newThread(adder(1000), "t3"); | |
var t4 = newThread(adder(10000), "t4"); | |
t1.start(); | |
t3.start(); | |
t2.start(); | |
t4.start(); | |
//while (true) { | |
//Thread.sleep(1000); | |
//print("t1 " + t1.state); | |
//print("t2 " + t2.state); | |
//print("t3 " + t3.state); | |
//if ( | |
//String(t1.state) == 'TERMINATED' && | |
//String(t2.state) == 'TERMINATED' && | |
//String(t3.state) == 'TERMINATED' | |
//) { | |
//break; | |
//} | |
//} | |
t1.join(); t2.join(); t3.join(); t4.join(); | |
print("sum = " + sum) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// mutex implemented by synchornized keyword | |
var Mutex = Packages.Mutex; | |
// Java native mutex | |
var Lock = java.util.concurrent.locks.ReentrantLock; | |
var Thread = java.lang.Thread | |
var mutex = new Mutex(); // or = new Lock(); | |
var sum = 0; | |
function adder(c) { | |
return function () { | |
while (c > 0) { | |
c -= 1; | |
mutex.lock(); | |
sum += 1; | |
mutex.unlock(); | |
} | |
} | |
} | |
function newThread(func, name) { | |
return new Thread(function run() { | |
print("thread " + name + " started"); | |
func(); | |
print("thread " + name + " ended"); | |
}); | |
} | |
var t1 = newThread(adder(10), "t1"); | |
var t2 = newThread(adder(100), "t2"); | |
var t3 = newThread(adder(1000), "t3"); | |
var t4 = newThread(adder(10000), "t4"); | |
t1.start(); | |
t3.start(); | |
t2.start(); | |
t4.start(); | |
//while (true) { | |
//Thread.sleep(1000); | |
//print("t1 " + t1.state); | |
//print("t2 " + t2.state); | |
//print("t3 " + t3.state); | |
//if ( | |
//String(t1.state) == 'TERMINATED' && | |
//String(t2.state) == 'TERMINATED' && | |
//String(t3.state) == 'TERMINATED' | |
//) { | |
//break; | |
//} | |
//} | |
t1.join(); t2.join(); t3.join(); t4.join(); | |
print("sum = " + sum) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
run: Mutex.class | |
jjs -cp . counter.js | |
Mutex.class: Mutex.java | |
javac Mutex.java | |
.PHONY: run |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.HashSet; | |
public class Mutex { | |
private boolean isLocked = false; | |
private long ownerId = 0; | |
public synchronized void lock() { | |
while (isLocked) { | |
try { | |
wait(); | |
} catch (InterruptedException e) {} | |
} | |
isLocked = true; | |
ownerId = Thread.currentThread().getId(); | |
} | |
public synchronized void unlock() { | |
if (ownerId != Thread.currentThread().getId()) { | |
throw new RuntimeException("try to unlock a mutex not locked by me"); | |
} | |
ownerId = 0; | |
isLocked = false; | |
notifyAll(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment