Skip to content

Instantly share code, notes, and snippets.

@suxue
Created March 11, 2014 05:01
Show Gist options
  • Save suxue/9479756 to your computer and use it in GitHub Desktop.
Save suxue/9479756 to your computer and use it in GitHub Desktop.
#jjs :call Java from js
// 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)
// 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)
run: Mutex.class
jjs -cp . counter.js
Mutex.class: Mutex.java
javac Mutex.java
.PHONY: run
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