您的位置:首页 > 职场人生

黑马程序员-我的入学笔记8-多线程的初次了解

2013-09-27 10:04 465 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a
href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

  今天再次看了关于多线程的视频,我发现同一段视频,再看第二遍,第三遍的时候,你的注意力在不同的点,这时才真正的理解了老师要讲解的内容.也许这就是读书百遍而意自现吧.通过老师视频中的画图和列子,我基本能够理解多线程的作用是怎么样的,但具体计算机内部怎么实现的还不知道,这里占时不去深究.在程序中线程怎么定义的,怎么使用的基本了解了,并自己写出来了代码实现了.通过这些天的学习,我发现我们的注意力要集中在重点上,要循序渐进的学习,不能广撒网,结果什么都理解的不透彻,程序内部的具体实现,等以后有了一定的基础,理解起来更容易.下面是我自己敲下视频中的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;//这里必须要引用线程的命名空间

namespace 有关多线程
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//这里屏蔽了对错误线程调用的警告
TextBox.CheckForIllegalCrossThreadCalls = false;
}

//单线程的缺点
private void btnSingleThread_Click(object sender, EventArgs e)
{
//for (int i = 0; i < 999999999; i++)
//{
//}
//MessageBox.Show("循环完毕~~~~~~");
CountTime();
}

/// <summary>
/// 循环计数封装成方法,便于调用
/// </summary>
void CountTime()//没有返回值和参数
{
//获取循环刚开始的时间
DateTime beginTime = DateTime.Now;
for (int i = 0; i < 999999999; i++)
{
}
//通过方法当前时间减去刚开始的时间,赋给ts
TimeSpan ts = beginTime.Subtract(DateTime.Now);
//再截取ts的秒表,得到所用的秒数
MessageBox.Show("循环完毕~~~~~~"+ts.TotalMilliseconds);
}

//使用多线程解决UI卡死问题
private void btnDoubleThread_Click(object sender, EventArgs e)
{
//完整的写法,先创建一个委托,再将委托传给线程调用
//ThreadStart ts=new ThreadStart(CountTime);
//Thread threadFirst = new Thread(ts);

//新建一个线程,传入线程的参数,一个没有返回值和参数的方法
Thread threadFirst = new Thread(CountTime);
//调用线程的属性,设置成后台线程,当前台所有线程结束时,后台线程直接退出
threadFirst.IsBackground = true;
//调用线程的Start方法,启动线程
threadFirst.Start();
}

/// <summary>
/// 改变文本框的值的方法
/// </summary>
void ChangeTxt()
{
for (int i = 0; i < 1000; i++)
{
int a = Convert.ToInt32(txtNum1.Text);
//控制台写出当前运行的线程,和a的值的变化
Console.WriteLine(Thread.CurrentThread.Name + ",a=" + a);
a++;
txtNum1.Text = a.ToString();
}
}

//两个线程同时调用一个方法,导致的线程重入的问题
private void btDoubleRepeat_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(ChangeTxt);
//线程的姓名属性
thread1.Name = "t1";
thread1.IsBackground = true;
thread1.Start();

Thread thread2 = new Thread(ChangeTxt);
thread2.Name = "t2";
thread2.IsBackground = true;
thread2.Start();
}

/// <summary>
/// 带参数的方法
/// </summary>
/// <param name="name"></param>
void ShowTextNum2(object name)
{
MessageBox.Show(name.ToString());
}

//执行带参数方法的线程
private void button1_Click(object sender, EventArgs e)
{
//完整的写法,new了带参数的委托
//ParameterizedThreadStart pts = new ParameterizedThreadStart(ShowTextNum2);
//Thread thread = new Thread(pts);

Thread thread = new Thread(ShowTextNum2);
thread.IsBackground = true;
//执行带参数的Start方法
thread.Start(txtNum2.Text);
}

/// <summary>
/// 带多个参数的方法
/// </summary>
/// <param name="name"></param>
void ShowTextNum3(object li)
{
List<string> listName = li as List<string>;
if (li != null)
{
foreach (string s in listName)
{
MessageBox.Show(s);
}
}
}
//调用带多个参数方法的线程
private void button3_Click(object sender, EventArgs e)
{
Thread tread3 = new Thread(ShowTextNum3);
tread3.IsBackground = true;
//这里的用集合直接将多个参数赋给方法
tread3.Start(new List<string>(){"jim","lucy","tom"});
}

//模拟线程的定义
public class MyThread
{
ThreadStart ts;
ParameterizedThreadStart pts;
public MyThread(ThreadStart ts)
{
this.ts = ts;
}
public MyThread(ParameterizedThreadStart pts)
{
this.pts = pts;
}

public void Start(object o)
{
if (o == null)
{
Thread tts = new Thread(ts);
tts.Start();
}
else
{
Thread ptts = new Thread(pts);
ptts.Start(o);
}
}
}

//用了自己定义的线程
private void button2_Click(object sender, EventArgs e)
{
MyThread tts = new MyThread(ChangeTxt);
tts.Start(null);
}

}
}

 学习是一个循序渐进的过程,也是在不断的自我调整,学习更有效的学习方法的过程,还有不断的合理分配利用好时间,和加强自制力的过程,在这个过程中不断的努力.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: