线程的执行方法内就是随机生成一定量的字符,然后输出,没必要太多的关注。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;namespace MonitorAndLock
{
class Program
{
private object synObj = new object();
private string buffer = null; public void go()
{
Thread t1 = new Thread(new ThreadStart(Producer));
Thread t2 = new Thread(new ThreadStart(Consumer));
t1.Name = "生产者线程";
t2.Name = "消费者线程";
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.ReadKey();
} public void Producer()
{
Console.WriteLine("{0}:开始执行", Thread.CurrentThread.Name);
for (int i = 0; i < 16; i++)
{
try
{
lock (synObj)
{
Random r = new Random();
int bufSize = r.Next() % 64;
char[] s = new char[bufSize];
for (int j = 0; j < bufSize; j++)
{
s[j] = (char)((int)'A' + r.Next() % 26);
} buffer = new string(s);
Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, buffer);
Monitor.Pulse(synObj);
Thread.Sleep(1000);
}
}
catch (System.Threading.ThreadInterruptedException ex)
{
Console.WriteLine("{0}:被终止{1}", Thread.CurrentThread.Name, ex.Message);
break;
}
finally
{
Monitor.Exit(synObj); //只要一调试,就会说:从不同步的代码块中调用了对象同步方法 }
} Console.WriteLine("{0}:执行完毕", Thread.CurrentThread.Name);
}
public void Consumer()
{
Console.WriteLine("{0}:开始执行", Thread.CurrentThread.Name);
if (buffer == null)
Thread.Sleep(1000);
for (int i = 0; i < 16; i++)
{
try
{
lock (synObj)
{
Monitor.Enter(synObj);
Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, buffer);
Monitor.Wait(synObj, 1000);
}
}
catch (System.Threading.ThreadInterruptedException ex)
{
Console.WriteLine("{0}:被终止{1}", Thread.CurrentThread.Name, ex.Message);
break;
}
finally
{
Monitor.Exit(synObj);
} } Console.WriteLine("{0}:执行完毕", Thread.CurrentThread.Name);
} }
public class Test
{
public static void Main()
{
Program tt = new Program();
tt.go();
}
}}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;namespace MonitorAndLock
{
class Program
{
private object synObj = new object();
private string buffer = null; public void go()
{
Thread t1 = new Thread(new ThreadStart(Producer));
Thread t2 = new Thread(new ThreadStart(Consumer));
t1.Name = "生产者线程";
t2.Name = "消费者线程";
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.ReadKey();
} public void Producer()
{
Console.WriteLine("{0}:开始执行", Thread.CurrentThread.Name);
for (int i = 0; i < 16; i++)
{
try
{
lock (synObj)
{
Random r = new Random();
int bufSize = r.Next() % 64;
char[] s = new char[bufSize];
for (int j = 0; j < bufSize; j++)
{
s[j] = (char)((int)'A' + r.Next() % 26);
} buffer = new string(s);
Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, buffer);
Monitor.Pulse(synObj);
Thread.Sleep(1000);
}
}
catch (System.Threading.ThreadInterruptedException ex)
{
Console.WriteLine("{0}:被终止{1}", Thread.CurrentThread.Name, ex.Message);
break;
}
finally
{
Monitor.Exit(synObj); //只要一调试,就会说:从不同步的代码块中调用了对象同步方法 }
} Console.WriteLine("{0}:执行完毕", Thread.CurrentThread.Name);
}
public void Consumer()
{
Console.WriteLine("{0}:开始执行", Thread.CurrentThread.Name);
if (buffer == null)
Thread.Sleep(1000);
for (int i = 0; i < 16; i++)
{
try
{
lock (synObj)
{
Monitor.Enter(synObj);
Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, buffer);
Monitor.Wait(synObj, 1000);
}
}
catch (System.Threading.ThreadInterruptedException ex)
{
Console.WriteLine("{0}:被终止{1}", Thread.CurrentThread.Name, ex.Message);
break;
}
finally
{
Monitor.Exit(synObj);
} } Console.WriteLine("{0}:执行完毕", Thread.CurrentThread.Name);
} }
public class Test
{
public static void Main()
{
Program tt = new Program();
tt.go();
}
}}
这是某书上的代码,它说换成 lock也可以!
{
}
//从这里开始aaa 已经被release 了 所以用不着Monitor.exit 来释放monitor.enter - monitor.exit 是要一起用的