JavaScript編纂マルチスレッドコード引用Conccurrent.Thread.js
7042 ワード
これは簡単な機能実現です.
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/javascript">
Concurrent.Thread.create(function(){
var i = 0;
while ( 1 ) {
document.body.innerHTML += i++ + "<br>";
}
});
</script>
このプログラムを実行すると0から始まる数字が順番に表示されます.次々に現れます.画面をスクロールして見てください.コードを詳しく調べてみましょう.彼はwhile(1)の条件を適用して、止められないサイクルを作りました.通常はこのように一つのスレッドを使い続けています.そして唯一のJavaScriptプログラムはブラウザが凍結しているように見えます.なぜ上のこのプログラムはあなたがこのようにすることを許可しますか?重要な点はwhile(1)上のConcerent.Thread.create()の文です.これはこのライブラリが提供する方法で、新しいスレッドを作成することができます.パラメータとして導入された関数は、この新しいスレッドで実行されます.プログラムを以下のように微調整します.
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/javascript">
function f ( i ){
while ( 1 ) {
document.body.innerHTML += i++ + "<br>";
}
}
Concurrent.Thread.create(f, 0);
Concurrent.Thread.create(f, 100000);
</script>
このプログラムでは、新しい関数f()が繰り返し表示されます.プログラムの開始時に定義されています.次に、f()をパラメータとして2回のcreate()メソッドを呼び出して、create()メソッドに伝える2つ目のパラメータは、修正せずにf()に伝えられます.このプログラムを実行すると、まず0から始まる小数点を見ます.次に、100,000から始まる大きな数を見ます.それから、前の小数点順の数字を続けます.プログラムは小数と大数を交互に表示することができます.これは2つのスレッドが同時に実行されていることを示しています.
もう一つの使い方を見せてください.上記の例は、create()メソッドを呼び出して、新しいスレッドを作成します.庫内の任意のAPIを呼び出しなくても、この目的を実現する可能性があります.例えば、前の例はこう書くことができる.
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/x-script.multithreaded-js">
var i = 1;
while ( 1 ) {
document.body.innerHTML += i++ + "<br>";
}
</script>
Scriptラベルの中で、JavaScriptで無限ループを書きました.ラベル内のtype属性に注目すべきです.そこはよく知らない値です.この属性がscriptタグの中に置かれていると、Conccurrent.Threadは新しいスレッド内でラベル間のプログラムを実行します.この例のように、コンカレント.Threadライブラリを含める必要があることを覚えておいてください.
Conccurrent.Threadがあれば、実行環境をスレッド間で切り替えられるようになります.たとえあなたのプログラムが長くても、連続性が強いです.この操作をどのように行うかを簡単に議論することができます.簡単に言えば、コード変換が必要です.大雑把に言うと、まずcreate()に伝達された関数を文字列に変換し、それが分割して実行されるまで書き換えます.これらのプログラムはスケジューリングされたプログラムに従って逐次実行され得る.スケジュールプログラムはマルチスレッドを調整する責任があります.言い換えれば、各修正後の関数は同じ機会で実行されます.Conccurrent.Threadは実際に新しいスレッドを作成していません.元々のシングルスレッドをもとにマルチスレッド環境をシミュレートしただけです.
変換後の関数は異なるスレッド内で動作しているように見えるが、実際にはスレッドだけがこのすべてをしている.変換後の関数内で同期通信を実行すると、ブラウザが凍結してしまいます.以前の問題はまったく解決されていないと考えるかもしれません.しかし、あなたは気を使う必要はありません.Concerent.ThreadはJavaScriptを適用した非同期通信方式で実現したカスタマイズ通信ライブラリを提供しています.これはスレッドがサーバの応答を待っている間に他のスレッドを実行するように設計されています.この通信はCocurrent.Thread.Httpの下にあります.その使い方は以下の通りです.
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/x-script.multithreaded-js">
var req = Concurrent.Thread.Http.get(url, ["Accept", "*"]);
if (req.status == 200) {
alert(req.responseText);
} else {
alert(req.statusText);
}
</script>
get()メソッドは、その名前が示すように、HTTPのGET方法により指定URLの内容を取得することができ、目標URLを最初のパラメータとして、HTTP要求ヘッダを表す1つの配列をオプションの第2のパラメータとして使用する.get()メソッドはサーバと対話し、サーバの応答を得た後、戻り値としてXMLHttpRequestオブジェクトを返す.get()メソッドが戻るとサーバから応答が来ていますので、その結果をコールバック関数で受信する必要はありません.もちろん、プログラムがサーバの応答を待っている間、ブラウザが凍結してしまうこともない.また、サーバにデータを送信するためのポスト()方法があります.
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/x-script.multithreaded-js">
var req = Concurrent.Thread.Http.post(url, "key1=val1&key2=val2");
alert(req.statusText);
</script>
post()メソッドは、目的URLを第一のパラメータとして、送信するコンテンツを第二のパラメータとします.get()メソッドのように、要求ヘッダをオプションの第三パラメータとしてもよい.
この通信ライブラリを使って第一例のget Artarticle()方法を実現すれば、文章の先頭例のような簡単な方法でget ArtarticleWithCache()、background Load()、および他のget Artarticle()メソッドの関数を作成することができます.そのバージョンでもbackground Loadは記事データを読んでいますが、他のスレッドがあります.この場合はユーザーに応答してください.ブラウザは凍結されません.