IT戦記 このページをアンテナに追加 RSSフィード Twitter

2007-11-05

JavaScript だってマルチスレッドくらいできるさ!

Rhino を使ってみた。

なんか spawn でスレッドが起動できる!便利!
spawn(function() {
    var i = 10;
    while(i--) print('hoge');
}); 
spawn(function() {
    var j = 10;
    while(j--) print('fuga');
}); 

結果

fugahoge

fuga
hogefuga

fuga
hogefuga

hoge
fuga
hogefuga

hogefuga

hogefuga

fuga
hoge
hoge
hoge
sync で同期を取る

print = sync(print); // <- これ

spawn(function() {
    var i = 10;
    while(i--) print('hoge');
}); 
spawn(function() {
    var j = 10;
    while(j--) print('fuga');
});

結果

fuga
hoge
fuga
hoge
fuga
hoge
fuga
hoge
fuga
hoge
fuga
hoge
fuga
hoge
fuga
hoge
fuga
hoge
fuga
hoge
sync はだいたいこんな感じになってた
// org/mozilla/javascript/tools/shell/Global.java
package org.mozilla.javascript.tools.shell
public class Global extends ImporterTopLevel {
    public static Object sync(Context cx, Scriptable thisObj, Object[] args, Function funObj) {
        return new Synchronizer((Function)args[0]);
    }
}

// org/mozilla/javascript/Synchronizer.java
package org.mozilla.javascript;
public class Synchronizer extends Delegator {
    public Object call(Context cx, Scriptable scope, Scriptable thisObj, Object[] args) {
        synchronized(thisObj) {
            return ((Function)obj).call(cx,scope,thisObj,args);
        }
    }
}

てことは sychronized(this) されるってことで sync を使うときは this に注意

で、 sync で BlockedQueue を作ろうと思ったんだけど

wait や notifyAll する方法がわかりません><

ということで sync は諦めて ReentrantLock を使うことにした
var lk = new java.util.concurrent.locks.ReentrantLock();
var queue = [];

queue._push = queue.push;
queue.push = function(o) {
  lk.lock();
  try {
    this._push(o);
  }
  finally {
    lk.unlock();
  }
};

queue._shift = queue.shift;
queue.push = function(o) {
  lk.lock();
  try {
    while (this.length == 0) {
      lk.unlock();
      lk.lock();
    }
    return this._shift();
  }
  finally {
    lk.unlock();
  }
};

できたー!

ってことで、これを使って doukaku.org のお題を説いてみた。

どう書く?org36211 id:amachang: JavaScript だってマルチスレッ...(アクセスログのIPアドレスを逆引き) - 投稿の詳細

まとめ

Rhino ドキュメント少ない><

John Resig を囲う会の資料を公開します!

よろしくお願いします。

http://amachang.art-code.org/ejohn/

思い出

英語が話せないので JavaScript で筆談

f:id:amachang:20071105125602j:image

Shibuya.JS 入りたい

f:id:amachang:20071105125601j:image

Boston.JS 作りたい

f:id:amachang:20071105125600j:image

takesako さんの Flickr から転載させていただきました!ありがとうございます!

http://flickr.com/photos/takesako/tags/shibuyajs/

See Also

John Resig - Speaking in Tokyo