------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
每个正在操作系统上运行的程序都是一个进程,一个线程可以包含一个或多个进程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。
一、 单线程简介
单线程顾名思义,就是只有一个线程。默认情况下,系统为应用程序分配一个主线程,该线程执行程序中以Main开始和结束的代码。
二、多线程简介
一般情况下,需要用户交互的软件都必须尽可能地对用户的活动作出反应,以便提供丰富多彩的用户体验。但同时它又必须执行必要的计算,以便尽可能快的将数据呈现给用户,这时可以使用多线程来实现
1、多线程的优点和缺点
多线程技术是一把双刃剑,在使用时需要充分考虑它的优缺点。
多线程处理可以同时运行多个线程。由于多线程应用程序将程序划分成多个独立的任务,因此可以在以下方面显著提高性能:
(1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;
(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;
(3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;
(4)可以随时停止任务;
(5)可以分别设置各个任务的优先级以优化性能。
同样的 ,多线程也存在许多缺点 ,在考虑多线程时需要进行充分的考虑。多线程的主要缺点包括:
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。
(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
(4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。
三、创建线程
要创建一个线程非常简单,只需将其声明并为其提供线程起始点处的方法委托即可。创建新的线程时需要使用Thread类,该类具有接受一个ThreadStart委托或parameterizedThreadStart委托的构造函数,该委托包装了调用Start方法时由新线程调用的方法。创建了Thread类的对象后,线程对象就已存在并已配置,但并未创建实际的线程,这时,只有在调用Start方法后,才会创建实际的线程。
如下:自定义一个静态的void类型方法createThread,然后在Main方法中通过实例化Thread类对象创建一个新的线程,最后调用Start方法启动该线程
static void Main(string[] args)
{
Thread myThead;//声明线程
myThead=new Thread(new ThreadStart(create Thread));//用线程起始点的ThreadStart委托创建该线程的实例
myThead.Start();//启动线程
}
public static void createThread()
{
console.write("创建线程");
四、线程的挂起、恢复、休眠和终止
创建完一个线程并启动后,还可以挂起、恢复、休眠或终止它。
线程的挂起和恢复分别可以通过调用Thread类中的Suspend方法和Resme方法实现。
1、Suspend方法
该方法用来挂起线程,如果线程已挂起,则不起作用。
语法如下:
public void suspend();
2、Resme方法实现
该方法用来继续已挂起的线程
语法如下:
public void Resume();
3、线程休眠主要通过Thread类的Sleep方法实现
将当前线程阻止指定的时间
语法如下:
public static void Sleep(TimeSpan timeout)
例如:Thread.Sleep(1000);//使线程休眠一秒钟
4、终止线程可以使用Thread类的Abort方法和Join方法实现
Abort方法 有两种重载
语法如下:
public void Abort()
public void Abort(object stateinfo)
Join方法用来阻止调用线程,直到某个线程终止时为止。、
语法如下:
public void Join()
实例如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;//引用线程命名空间
namespace 线程终止
{
class Program
{
static void Main(string[] args)
{
Thread myThread;//声明线程
myThread = new Thread(new ThreadStart(createThread));//用线程起始点的ThreadStart委托创建该线程的实例
myThread.Start();//启动线程
// myThread.Join();
myThread.Abort();//终止线程
Console.ReadKey();
}
public static void createThread()
{
Console.WriteLine("线程实例");
}
}
}