主题:线程
一、 Thread t = new Thread(my.DownFile);//我们构造一个thread对象的时候,可以传递一个静态方法,也可以传递一个对象的普通方法
Thread t = new Thread(DownFile); DownFile若有参数, 仅能用object参数类型。
二、 后台线程和前台线程
前台线程不会受后台线程关闭的影响。反之,则会。
//当所有的前台线程运行完毕,如果还有后台线程运行的话,所有的后台线程会被终止掉。
三、 线程ID : Thread.CurrentThread.ManagedThreadId
四、控制线程
1,获取线程的状态(Running还是Unstarted,,,),当我们通过调用Thread对象的Start方法,可以创建线程,但是调用了Start方法之后,新线程不是马上进入Running状态,而是出于Unstarted状态,只有当操作系统的线程调度器选择了要运行的线程,这个线程的状态才会修改为Running状态。我们使用Thread.Sleep()方法可以让当前线程休眠进入WaitSleepJoin状态。
2,使用Thread对象的Abort()方法可以停止线程。调用这个方法,会在终止要终止的线程中抛出一个ThreadAbortException类型的异常,我们可以trycatch这个异常,然后在线程结束前做一些清理的工作。
3,如果需要等待线程的结束,可以调用Thread对象的Join方法,表示把Thread加入进来,停止当前线程,并把它设置为WaitSleepJoin状态,直到加入的线程完成为止。
五、线程池
创建出来的只能是后台线程。
创建线程需要时间。 如果有不同的小任务要完成,就可以事先创建许多线程 ,在应完成这些任务时发出请求。 这个线程数最好在需要更多的线程时增加,在需要释放资源时减少。不需要 自己创建线程池,系统已经有一个ThreadPool类管理线程。这个类会在需要时增减池中线程的线程数,直到达到最大的线程数。 池中的最大线程数是可配置的。 在双核 CPU中 ,默认设置为1023个工作线程和 1000个I/o线程。也可以指定在创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数。如果有更多的作业要处理,线程池中线程的个数也到了极限,最新的作业就要排队,且必须等待线程完成其任务。
代码: ThreadPool.QueueUserWorkItem(ThreadMethod); ThreadMethod必须有且仅有一个object类型参数。
使用线程池需要注意的事项:
线程池中的所有线程都是后台线程。 如果进程的所有前台线程都结束了,所有的后台线程就会停止。 不能把入池的线程改为前台线程 。
不能给入池的线程设置优先级或名称。
入池的线程只能用于时间较短的任务。如果线程要一直运行(如 Word的拼写检查器线程),就应使用Thread类创建一个线程。
六、任务
是对线程的封装
七、任务层次结构
我们在一个任务中启动一个新的任务,相当于新的任务是当前任务的子任务,两个任务异步执行,如果父任务执行完了但是子任务没有执行完,它的状态会设置为WaitingForChildrenToComplete,只有子任务也执行完了,父任务的状态就变成RunToCompletion
八、使用lock(锁)解决争用条件的问题
lock 只能锁引用类型的对象,不能锁值类型的。
线程问题-死锁
类似于两人各自占用一个资源,却同时申请对方的资源。
如何解决死锁
在编程的开始设计阶段,设计锁定顺序