多线程 彩票小程序

多线程 彩票小程序

        //控制线程数组启动/停止
        bool isRun = false;
        //控制label中随机数字变化的线程数组
        Thread[] Ts = new Thread[3];
        private void button5_Click(object sender, EventArgs e)
        {
           //总控线程
           Thread g = new Thread(run);
            //总控线程启动
           g.Start();


           if (isRun)
           {
               button5.Text = "开始";
           }
           else
           {
               button5.Text = "停止";
           }
                
        }

        //总控线程需要执行的核心方法
        private void run()
        {
            //遍历线程数组
            #region
            foreach (Thread T in Ts)
            {
                //判断是启动还是停止线程数组中的每个线程
                if (!isRun)
                {
                    //通过委托回调设置存放结果的标签值为空
                    myInvoke("");
                    //判断当前线程状态,由于是后台线程所以用字符串判断方法
                    if (T.ThreadState.ToString().IndexOf(ThreadState.Unstarted.ToString())>=0)
                    {
                        //如果程线未启动则启动
                        T.Start();
                    }
                    else
                    {
                        //如果程线挂起则恢复
                        //(在此程序中通过代码控制线程组的线程状态只有未启动,启动,挂起三种状态)
                        T.Resume();
                    }
                    
                }
                else
                {
                    //当前线程组中的当前线程挂起
                    T.Suspend();
                    //根据当前线程的name决定传入委托回调的参数
                    switch (T.Name)
                    {
                        case "0":
                            myInvoke(label3.Text);
                            break;
                        case "1":
                            myInvoke(label4.Text);
                            break;
                        case "2":
                            myInvoke(label6.Text);
                            break;
                    }

                }
                //每一次启动/停止之间间隔一秒
                Thread.Sleep(1000);
            }
            #endregion
            //启动状态标识符的值取反
            isRun = !isRun;
        }

        /// 
        /// 用来设置显示彩票随机数字的委托
        /// 
        /// 用来显示的标签
        delegate void dels(Label lbl);
        /// 
        /// 用来获取抽奖结果的委托
        /// 
        /// 抽出的数字或设为空值

        delegate void dels1(string str);

        /// 
        /// 用来显示随机数字的方法,由线程组线程执行
        /// 
        private void childThreadF()
        {
            //获取当前线程
            Thread T = Thread.CurrentThread;
            while (true)
            {
                Thread.Sleep(200);
                //根据当前线程的Name来决定哪个label显示随机数
                switch (T.Name)
                {
                    case "0":
                        //调用方法
                        myInvoke(label3);
                        break;
                    case "1":
                        myInvoke(label4);
                        break;
                    case "2":
                        myInvoke(label6);
                        break;
                }
            }
        }
        /// 
        /// 使用委托回调实现跨线访问(显示随机数)
        /// 
        /// 要访问的lable

        private void myInvoke(Label lbl)
        {
            if (lbl.InvokeRequired)
            {
                lbl.Invoke(new dels(this.setTexts), lbl);
            }
            else
            {
                setTexts(lbl);
            }
        }
        /// 
        /// 委托回调中invoke调用的方法
        /// 
        /// 要访问的lable
        private void setTexts(Label lbl)
        {
            lbl.Text = R.Next(10).ToString();
        }


        /// 
        /// 使用委托回调实现跨线访问(显示抽奖结果)
        /// 
        /// 抽出的数字或空字符串
        private void myInvoke(string str)
        {
            if (label5.InvokeRequired)
            {
                label5.Invoke(new dels1(this.setTexts), str);
            }
            else
            {
                setTexts(str);
            }
        }
        /// 
        /// 委托回调中invoke调用的方法
        /// 
        /// 抽出的数字或空字符串
        private void setTexts(string str)
        {
            //如果形参str的值为空则清空结果
            if (str == "")
            {
                label5.Text = str;
            }
            label5.Text += str;
        }
线程锁的使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace deadlock
{
    class Program
    {
        static void Main(string[] args)
        {
            A myA = new A();
            Thread T1 = new Thread(myA.test1);
            Thread T2 = new Thread(myA.test2);
            T1.Start();
            T2.Start();
            Console.WriteLine("哦!");
        }
    }
    class A
    {
        object a=0,b=0;
        public void test1()
        {
            lock(a)
            {
                Thread.Sleep(200);
                lock(b)
                {
                    Console.WriteLine("嘿嘿!");
                }
            }
        }
        public void test2()
        {
            lock (b)
            {
                Thread.Sleep(200);
                lock (a)
                {
                    Console.WriteLine("哈哈!");
                }
            }
        }
    }
}

一个银行存取款小示例

using System;
using System.Threading;
// 银行帐户类
class Account 
{	
	int balance;			// 余额
	Random r = new Random();
    Object o = new Object();
    
	public Account(int initial) 
	{
		balance = initial;
	}
	// 取钱
	int Withdraw(int amount) 
     {
         
		if (balance < 0) 
		{
			throw new Exception("余额为负!");
		}
        lock (o)
		{
			if (balance >= amount) 
			{
				Console.WriteLine("原有余额:  " + balance);
				Console.WriteLine("支取金额: -" + amount); 
				balance = balance - amount;
				Console.WriteLine("现有余额:  " + balance);
				return amount;
			}
			else 
			{
				return 0;		// 拒绝交易
			}
		}
	}
      // 测试交易
	public void DoTransactions() 
	{
		// 支取随机的金额100次
		for (int i = 0; i < 100; i++) 
		{
			Withdraw(r.Next(1, 100));
		}
	}
}
class TestApp
{
	public static void Main() 
	{
		// 建立10个线程同时进行交易
		Thread[] threads = new Thread[10];
		Account acc = new Account (1000);
		for (int i = 0; i < 10; i++)
        {
            Thread t = new Thread(new ThreadStart(acc.DoTransactions));
            threads[i] = t;
        }
        for (int i = 0; i < 10; i++)
        {
            threads[i].Start();
        }
    }
}

                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值