线程同步实例

  1using System;
  2using System.Drawing;
  3using System.Collections;
  4using System.ComponentModel;
  5using System.Windows.Forms;
  6using System.Data;
  7// 新添加的一个命名空间。
  8using System.Threading;
  9
 10namespace ThreadSync
 11{
 12    /// <summary>
 13    /// 线程同步实例。
 14    /// </summary>

 15    public class Form1 : System.Windows.Forms.Form
 16    {
 17        private System.Windows.Forms.Label label1;
 18        private System.Windows.Forms.Label label2;
 19        private System.Windows.Forms.Button button1;
 20        private System.Windows.Forms.Button button2;
 21        private System.Windows.Forms.Label labProduce;
 22        private System.Windows.Forms.Label labConsume;
 23        /// <summary>
 24        /// 必需的设计器变量。
 25        /// </summary>

 26        private System.ComponentModel.Container components = null;
 27
 28        public Form1()
 29        {
 30            // Windows 窗体设计器支持所必需的
 31            InitializeComponent();
 32            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
 33        }

 34
 35        /// <summary>
 36        /// 清理所有正在使用的资源。
 37        /// </summary>

 38        protected override void Dispose( bool disposing )
 39        {
 40            if( disposing )
 41            {
 42                if (components != null)
 43                {
 44                    components.Dispose();
 45                }

 46            }

 47            base.Dispose( disposing );
 48        }

 49        Windows Form Designer generated code
129
130        /// <summary>
131        /// 应用程序的主入口点。
132        /// </summary>

133        [STAThread]
134        static void Main()
135        {
136            Application.Run(new Form1());
137        }

138        private ReaderWriterLock rwl = new ReaderWriterLock();
139        private Thread thdProduce = null;
140        private Thread thdConsume = null;
141        private int m_iCounter = 0;
142        // 生产者线程函数
143        private void ThreadProduce()
144        {
145            while(true)
146            {
147                rwl.AcquireWriterLock(Timeout.Infinite);
148                while(m_iCounter < 1000)
149                {
150                    m_iCounter++;
151                    labProduce.Text = m_iCounter.ToString();
152                    Thread.Sleep(10);
153                }

154                rwl.ReleaseWriterLock();
155            }

156        }

157        // 消费者线程函数
158        private void ThreadConsume()
159        {
160            while(true)
161            {
162                rwl.AcquireReaderLock(Timeout.Infinite);
163                while(m_iCounter > 0)
164                {
165                    m_iCounter--;
166                    labConsume.Text = m_iCounter.ToString();
167                    Thread.Sleep(10);
168                }

169                rwl.ReleaseReaderLock();
170            }

171        }

172        // 启动线程的运行。
173        private void button1_Click(object sender, System.EventArgs e)
174        {
175            button1.Enabled = false;
176            button2.Enabled = true;
177            thdProduce = new Thread(new ThreadStart(this.ThreadProduce));
178            thdConsume = new Thread(new ThreadStart(this.ThreadConsume));
179            if(thdProduce != null)
180                thdProduce.Start();
181            if(thdConsume != null)
182                thdConsume.Start();
183        }

184        // 停止线程的运行。
185        private void button2_Click(object sender, System.EventArgs e)
186        {
187            rwl.ReleaseLock();
188            if(thdProduce != null)
189                thdProduce.Abort();
190            thdProduce = null;
191            if(thdConsume != null)
192                thdConsume.Abort();
193            thdConsume = null;
194            button1.Enabled = true;
195            button2.Enabled = false;
196        }

197        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
198        {
199            rwl.ReleaseLock();
200            if(thdProduce != null)
201                thdProduce.Abort();
202            if(thdConsume != null)
203                thdConsume.Abort();
204        }

205    }

206}

207
posted on 2007-08-22 09:42  Gofficer  阅读(420)  评论(0)    收藏  举报