在这里,我用的是一个winfrom窗体,以控制台输出,核心代码如下
public partial class Form1 : Form
{//转载请保留 http://www.luofenming.com/show.aspx?id=ART2020060100001
public Form1()
{
InitializeComponent();
}
//定义三个信号量对三个线程进行控制
static AutoResetEvent AautoResetEvent = new AutoResetEvent(false);
static AutoResetEvent BautoResetEvent = new AutoResetEvent(false);
static AutoResetEvent CautoResetEvent = new AutoResetEvent(false);
static void ShowA()
{
for (int i = 0; i < 10; i++)
{
AautoResetEvent.WaitOne();//阻塞 等待信号
Console.Write("A");
BautoResetEvent.Set();//设置ShowB 信号量有信号 则放开阻塞往下执行ShowB
}
}
static void ShowB()
{
for (int i = 0; i < 10; i++)
{
BautoResetEvent.WaitOne();
Console.Write("B");
CautoResetEvent.Set();
}
}
static void ShowC()
{
for (int i = 0; i < 10; i++)
{
CautoResetEvent.WaitOne();
Console.Write("C");
AautoResetEvent.Set();
}
}
/// <summary>
/// 执行三个线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
new Action(ShowA).BeginInvoke(null, null);
new Action(ShowB).BeginInvoke(null, null);
new Action(ShowC).BeginInvoke(null, null);
AautoResetEvent.Set();//设置ShowA 信号量有信号 则放开阻塞往下执行ShowA
//最终输出结果ABCABCABCABCABCABCABCABCABCABC
}
}