您的位置:首页 > 编程语言 > C#

c#线程学习笔记一---基本概念

2012-06-15 10:50 567 查看
参考文章:MSDN:System.Threading命名空间:http://msdn.microsoft.com/zh-cn/library/system.threading.aspx

MSDN:Thread类:http://msdn.microsoft.com/zh-cn/library/system.threading.thread.aspx

c#温故而知新:线程篇:http://www.cnblogs.com/JimmyZheng/archive/2012/06/10/2543143.html#2400355

c#多线程学习: http://kb.cnblogs.com/page/42528/

c#线程手册:http://www.cnblogs.com/danielwise/archive/2011/12/30/2307115.html

c#中的线程:/article/5736594.html

C#线程、多线程、线程池、后台线程:http://www.cnblogs.com/linzheng/archive/2012/04/11/2442061.html

----------------------------------------------------------------------------------------------------------------

学习了解到线程的内容的确是负责繁多,这里只是作为个人学习要点的记录,并参考各位前辈的博文所得

Thread的2个构造函数:

一:Thread(ParameterizedThreadStart) 用于带object且无参数的方法的抽象(委托)

二:Thread(ThreadStart) 用于无参数且无返回的方法的抽象(委托)

通过在程序前

Using System.Threading;


来获得线程有关成员的命名空间

1.声明线程对象的委托类型签名为

void 函数名()
void 函数名(object obj参数名)


其中都为无返回值的方法,而带有传入参数的方法,必须为object类型

2.声明线程对象的方式

直接利用函数名声明

Thread 线程对象=new Thread(函数名);


将函数转化为委托再进行声明

Thread 线程对象=new Thread(new ThreadStart(函数名));//无参数委托声明
Thread 线程对象=new Thread(new ParameterizedThreadStart(函数名));//有object参数委托声明


利用匿名方法声明

Thread 线程对象 = new Thread(
() => {
/*方法的实现过程*/
});


3.Thread类型和对象的方法浅析

Thread.Sleep(毫秒);


Sleep方法会使得当前执行的线程以一定的时间挂起,从而让出资源好方便给其他的线程进行执行,注意Sleep是Thread类型的静态方法,对其的调用只对当前执行的线程起作用

Thread对象.Jion();


Jion方法起到阻塞其他线程的执行,只等待当前调用该方法的线程对象执行完毕后,再允许其他线程继续执行

Thread对象.start();
Thread对象.start(object参数);


start方法起到开始线程执行的作用,当遇到委托方法是带object的参数时,可以通过该方法来传入参数

Thread对象.Abort();


Abort方法起到对调用方法的线程对象的释放和终止,同时引发一个ThreadAbortException异常,

利用Abort结束线程,在本线程码执行区域,线程对象显示的Thread.CurrentThread.ThreadState为AbortRequest,只有当该段线程退出后,才会显示为Aborted

【注意】1.如果对未启动的线程调用Abort,那么线程一旦启动就会被终止

2.对已经挂起的线程调用Abort,会导致引发ThreadStateException异常,并将 AbortRequested 添加到被中止的线程的ThreadState 属性中。直到调用 Resume 后,才在挂起的 线程中引发 ThreadAbortException。如果在正在执行非托管代码的托管线程上调用 Abort,则直到线程返回到托管代码才引发 ThreadAbortException。

Thread对象.Interrupt();


Interrupt方法起到对线程对象的挂起作用,同样在调用此方法的线程上引发一个异常:ThreadInterruptedException,和Abort方法不同的是,被挂起的线程可以唤醒,且被挂起时在本线程的执行区域里。该线程的Thread.CurrentThread.ThreadState为为Running。

Thread对象.Suspend();//挂起当前线程对象

Thread对象.Resume();//恢复当前被挂起的线程


Suspend 是让线程对象挂起,而Resume方法能够恢复当钱被挂起的线程

Lock锁的概念及使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace 线程5
{
class Program
{
static object mylock = new object();//声明一个object类型的id

static void Main(string[] args)
{
IList<Thread> threads = new List<Thread>();//以IList<T>声明一组线程对象
for (int i = 0; i < 5; i++)
{
Thread t = new Thread(new ParameterizedThreadStart(myprocess));
threads.Add(t);//将新的线程对象添加到队列
}
for(int i=0;i<5;i++)
{
threads[i].Start(i);//依次执行线程队列中的对象
//threads[i].Join();这里也可以用Jion方法来控制线程的执行
}
}

static void myprocess(object i)
{
lock (mylock)//运用lock,锁住固定代码区域,使得只能一次允许一个线程执行该段代码
{
Console.WriteLine("线程{0}执行", i.ToString());
Thread.Sleep(1000);
}
}
}
}


Lock的作用是使得每次只允许一个线程去访问执行所锁住区域的代码,从而控制线程的执行

摘要参考:线程的一些常用属性

1 CurrentThread

获取到当前线程的对象

2 IsAlive

判断线程是否处于激活状态

3 IsBackground

设置该线程是否是后台线程,一旦设置true 的话,该线程就被标示为后台线程

再次强调下后台线程的终止不会导致进程的终止

4 IsThreadPoolThread

只读属性标示该线程是否属于线程池的托管线程,一般我通过线程池创建的线程该属性都是true

5 Name

获取到线程的名字,我们可以根据业务或者逻辑来自定义线程的名字

6 Priority

这个属性表示线程的优先级,我们可以用ThreadPriority这个枚举来设置这个属性

ThreadPriority包含有5个优先级大家了解下就行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: