多线程简单阐述

多线程简单阐述

what?
在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。
进程中会有一个默认的线程,此默认的线程会负责界面的创建和相应用户的操作,因此默认线程也叫UI线程,主线程。学习操作系统可以了解。

why?

线程的引入是为了减少程序并发执行的开销,提高并发性。线程是作为调度和分派的基本单位,而进程则是资源分配的基本单位。正是由于将这两方面的分开,使得线程几乎不占资源,而可以轻装前进,使得系统并发性显著提高。多线程的引入也是为了一次执行多件事情,也是提高了并发执行。

how?
多线程的实现
1.首先添加命名空间(包含线程操作)
using System.Threading
2. 线程的参数,通过观察c#中线程的实现可以知道Thread(ThreadStart start)
此参数为委托类型用来传递需要执行的方法,该委托public delegate void ThreadStart(),因为函数签名要与委托一致,所以所传入的方法无返回值,无参数。而我们只需传入方法名即可,可以认为是一种简写,vs帮我们隐士的实现了委托。
3. 首先写出需要传入的方法。
4. 创建线程的对象。
5. 调用线程对象的Start()方法。
此方法只是标志。该线程可以执行,但不一定立即执行,只是放到cpu的可调度队列中。具体的执行时间需要看cpu的调度。

为线程执行计时
DateTime begeinTime = DateTime.Now
一段需要测算时间的代码
TimeSpan ts= beginTime.Subtract(DateTime.Now);
MessageBox.Show(ts.TotalMilliseconds)

前台线程和后台线程
1.c#中所应用的线程其实是调用了系统的线程。
2.创建线程默认为前台线程,特点,所有的前台线程结束后,程序才结束。
3. 后台线程,特点,只要前台线程全部结束,后台线程自动关闭。
设置后台线程 调用线程对象的一个IsBackGround方法设置为True

线程的同步问题

C#中禁止跨线程访问。

TextBox.CheckForIllegalCrossThreadCalls=false;任何一个控件都可以调用禁止跨线程访问。

线程的同步问题,类似与操作系统中进程同步问题。由于cpu执行任务的时候,应用时间片轮转原则在不同任务中进行切换而操作的,因此会产生进程同步问题,即一个进程在执行过程中被切换,另一个进程执行,如过这两个进程中有相关的操作,可能会导致结果的错误。(同理可以理解线程,就是线程重入问题)

线程的调度方式

由于cpu调度的时间片轮转原则所以分为:抢占式和非抢占式两种

同步问题在c#中的方法,就是操作系统中线程互斥锁。
加锁即可
lock(this)
{
线程执行的代码
}

线程的内部实现

首先查看Thread的定义可以看到其参数类型是ThreadStart,在查看其定义可以知道,其实使用委托实现,那么目标基本清楚了。
public delegate void ThreadStart()

大致模拟一下线程的实现代码
自己写一个类MyThread模拟,内部实现可以理解为:
首先定义了一个委托作为线程的参数
然后利用构造函数对线程进行初始化,最后实现各种方法。

ThreadStart threads;
public MyThread(ThreadStart ts)
{
this.threads = ts;
}
public void Start()
{
threads();
}

线程中常用方法:

Start()启动线程
Abort()终止线程
Thread.Sleep(int time休息毫秒数)
静态方法,暂停当前线程一段时间
Thread.CurrentThread()
获取当前线程的引用(就是取得当前cpu运行的线程)

线程中执行带参数的方法

上面刚才已经提到了,线程的参数用委托实现,既然是委托实现,那么方法的签名需要和该委托的签名一致。无返回值无参数。那定义一个带参数的函数可定不能用该方法。

这里线程还提供了一个
public Thread(ParameterizedThreadStart start)方法,其参数的具体定义是
public delegate void ParameterizedThreadStart(object obj)
那么就是一个带object参数的方法,如果需要传参,则使用该方法。与之匹配的还有一个public void Start(object parameter);方法用来传入函数的参数。

线程中执行带多个参数的方法

既然已经有了一个带object参数的方法,object是任何对象的父类,那么可以传递任何类型的参数都行。

laizi:https://www.cnblogs.com/summers/archive/2013/04/13/3019521.html

原文地址:https://www.cnblogs.com/Bing010407/p/13944557.html