原文地址:http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html
最基本的例子:
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(WriteY);
t.Start();
while (true)
Console.Write("x");
}
static void WriteY()
{
while (true)
Console.Write("y");
}
}
}
主线程创建了线程T运行了方法WriteY,主线程输出X。
线程中的局部变量:
class Program
{
static void Main(string[] args)
{
new Thread(Go).Start();
Go();
}
static void Go()
{
for(int i=0;i<5;i++)
{
Console.Write("?");
}
}
}
主线程和新创建的线程同时调用方法Go,输出的结果为10个“?”。变量的副本分别在各自的内存堆栈中创建,独立不会受到影响。
线程中的全局变量:
class Program
{
static bool done;
static void Main(string[] args)
{
Program p = new Program();
new Thread(p.Go).Start();
p.Go();
}
void Go()
{
if(!done)
{
done = true;
Console.WriteLine("Done");
}
}
}
全局变量会被线程共享,所以最后输出的结果是一个“Done”。
如果调换方法Go中done=true和console的位置,就会输出两个Done,这是由于一个线程在判断if块的时候,另一个线程正在输出,还没有改变done的值。所以就需要lock。
简单的Lock
class Program
{
static bool done;
static object locker = new object();
static void Main(string[] args)
{
new Thread(Go).Start();
Go();
}
static void Go()
{
lock(locker)
{
if(!done)
{
Console.WriteLine("Done");
done = true;
}
}
}
}
lock(object A){code B}
首先判断object A是否被lock,如果没有则lock,直到code B运行结束。
在code B运行期间,不能调用code B和object A。
object A一般使用一个私有,静态,对象(private static object)
http://www.cnblogs.com/apsnet/archive/2012/07/08/2581475.html
关于objectA 的作用:
如果有两个lock,参数都是objectA ,则这两个锁中的后者会被前者阻塞。
而如果有另一个lock的参数并不是objectA,即使他对objectA进行操作,也是可以通过的。
上面的例子中,应该是由于codeB被禁止调用,Main()中的Go()这一行被阻塞。
停止线程还可以使用sleep,——>Thread.Sleep (TimeSpan.FromSeconds (30));
还有 Join():
Join可以停止调用线程,知道被调用线程运行结束。
在Main()中使用Thread.Join(),Main线程会被阻止,到Thread这个线程开始运行至结束。