学习系列一:多线程理解

开始写对多线程的理解。主要就写 Thread 和 Task 的应用吧。感觉现在的水平太低了,只达到能看懂一些的水平,需要好好努力!!!

一、Thread

1.创建和启动线程线程。

 

Thread t = new Thread(Do);  //创建一个线程,线程执行 Do() 方法
t.Start(str);     //参数str 传给线程方法 Do()
public static void Do(object str){  }

 

也可以这样创建并启动线程:

 

Thread tt = new Thread(()=>{
     //写相关方法
});

 

2.线程方法

 

(1)sleep:线程等待,这个最简单;

(2)join:让并发行处理变成串行化。即主线程必须等待子线程执行完之后再执行完。

 

class Test
{
     static void Main()
     {
         Thread t = new Thread(Run);
         t.Start();
         //Join相当于把Run方法内嵌如此
         t.Join();
         //主线程必须在执行完 t线程 之后才能执行。
         Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
     }
 
     static void Run()
     {
        //等待5s
         Thread.Sleep(5000);
         Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
     }
}

 

 

 

 

 

 

(3)Interrupt和Abort:这两个关键字都是用来强制终止线程,不过两者还是有区别的。

   ① Interrupt:  抛出的是 ThreadInterruptedException 异常。

     Abort: 抛出的是 ThreadAbortException 异常。

   ② Interrupt:如果终止工作线程,只能管到一次,工作线程的下一次sleep就管不到了,相当于一个contine操作。

      Abort:这个就是相当于一个break操作,工作线程彻底死掉。

3.线程适合做一些耗时但不很及时的需求,比如可以开线程下图片,连接数据库等等,当然线程可以用来做负载;

 

线程的优点还是比较多的,每个线程都需要默认的堆栈空间,所以说线程数受到内存空间大小的限制,如果线程数开的太多

反而适得其反,进程被分配的时间片会被线程分的更细,也就导致了处理器需要更频繁的在线程之间来回切换。

 

 

二、Task

主线程要等待前台线程执行完毕之后才结束;

但是主线程不必等待后台线程执行完毕后才结束;

所有的 task 都是后台线程。Task 的功能跟线程池的功能类似。

1.创建新的 Task:

可以使用构造方法:

 

Task t1 = new Task(Method);

 

也可以用 Task.Factory

 

var  task01 = Task.Factory.StartNew(()=>
{
    //写需要执行的方法
});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值