Skip to content

Instantly share code, notes, and snippets.

@sonygod
Created February 28, 2013 05:56
Show Gist options
  • Save sonygod/5054556 to your computer and use it in GitHub Desktop.
Save sonygod/5054556 to your computer and use it in GitHub Desktop.
多线程演示3:共享obj
package ;
import neko.vm.Thread;
import neko.vm.Deque;
import neko.vm.Mutex;
/**
* ...
* @author sonygod VKT
*
* 多线程演示 3
*/
class Obj
{
public var m:Mutex;
@:isVar
public var val(get,set):Int;
public function new()
{
m = new Mutex();
val = 0;
}
private function get_val()
{
m.acquire();
var ret = val;
m.release();
return ret;
}
private function set_val(v:Int)
{
m.acquire();
val = v;
m.release();
return v;
}
}
class TestThread
{
var testShareNo :Int= 9999;
public function new()
{
var thread1 = Thread.create(thread1Call);
var thread2 = Thread.create(thread2Call);
thread1.sendMessage(Thread.current());
thread1.sendMessage(thread2);
thread2.sendMessage(Thread.current());
var obj = new Deque<Int>();
var thread3 = Thread.create(thread3Call);
var thread4 = Thread.create(thread4Call);
thread3.sendMessage(Thread.current());
thread3.sendMessage(thread4);
thread3.sendMessage(obj);
thread4.sendMessage(Thread.current());
thread4.sendMessage(obj);
var obj2 = new Obj();
thread3.sendMessage(obj2);
thread4.sendMessage(obj2);
Thread.readMessage(true);
Thread.readMessage(true);
Thread.readMessage(true);
Thread.readMessage(true);
trace("finish" + testShareNo);
Thread.readMessage(true);
}
function thread1Call():Void {
var main :Thread= Thread.readMessage(true);
var thread2 :Thread= Thread.readMessage(true);
trace("thread1 got it ");
for (ii in 0...100) {
thread2.sendMessage("sum" + ii);
testShareNo++;
Sys.sleep(1 / 100);
}
main.sendMessage("done");
}
function thread2Call():Void {
var main :Thread = Thread.readMessage(true);
trace("thread2 got it ");
for (ii in 0...100) {
trace("thread2--"+Thread.readMessage(true));
}
main.sendMessage("done");
}
function thread3Call():Void{
var main :Thread= Thread.readMessage(true);
var thread4 :Thread = Thread.readMessage(true);
var obj:Deque<Int> = Thread.readMessage(true);
var obj2:Obj = Thread.readMessage(true);
trace("thread3 got it "+obj);
for (ii in 0...100) {
thread4.sendMessage("sum" + ii);
testShareNo++;
obj.push(ii);
obj2.val = ii;
Sys.sleep(1 / 100);
}
thread4.sendMessage("ok");
main.sendMessage("done");
}
function thread4Call():Void{
var main :Thread = Thread.readMessage(true);
var obj:Deque<Int> = Thread.readMessage(true);
var obj2:Obj = Thread.readMessage(true);
trace("thread4 got it ");
for (ii in 0...100) {
trace("thread4--" + Thread.readMessage(true));
trace("t4 got: " + obj.pop(true));
trace("t4 obj2" + obj2.val);
}
trace(Thread.readMessage(true));
//trace("thread4-pop" + Thread.readMessage(true).pop());
main.sendMessage("done");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment