多线程 彩票小程序
//控制线程数组启动/停止
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();
}
}
}