一、多线程前台线程和后台线程 前台线程:只有所有的前台线程都关闭才能完成程序的关闭。
后台线程:只要所有的前台线程结束,后台线程自动结束。
Thread threadFrist =new Thread (方法名);
threadFrist .IsBackGround=true;//将线程threadFrist 设置为后台线程 (当所有的前台线程结束,后台线程自动退出)
二、多线程线程重入的问题
以下代码是定义了两个线程,这两个线程执行同一个方法ChangTxt(),如果只有一个线程执行ChangTxt方法,那么txtNum文本里面的值是10000,那么两个线程都执行同一个方法ChangTxt,是不是文本框里面的值就是20000呢?答案小于20000 ,因为在执行这两个线程时,并不是说第一个线程执行完这个方法后,第二个线程再执行,CPU在执行这两个线程是执行一会线程1在执行线程2,比如线程1在执行完代码:int num = int.Parse(txtNum.Text.ToString().Trim());后就去执行代码2:这时候线程1处于暂停状态,这样有事我再用多线程是会发现数据的丢失,这就是多线程线程重入的问题引起的。
public Thread()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;//关闭当前窗体 对非法跨线程访问 文本框控件 的检查
}
/// <summary>
/// 修改文本框里面的内容
/// </summary>
void ChangTxt()
{
for (int i = 0; i < 10000; i++)
{
int num = int.Parse(txtNum.Text.ToString().Trim());
num++;
txtNum.Text = num.ToString();
}
}
private void btnThreadProblem_Click(object sender, EventArgs e)
{
//创建线程
Thread threadFrist = new Thread(ChangTxt);
threadFrist.IsBackground = true;//把线程设置为后台线程
threadFrist.Start();//开启线程
Thread threadFrist2 = new Thread(ChangTxt);
threadFrist2.IsBackground = true;
threadFrist2.Start();
}
|