您现在的位置是:首页 >

不同线程调用同一个函数 实例讲解.NET多线程执行函数

火烧 2022-07-07 03:14:33 1053
实例讲解.NET多线程执行函数   这里为什么会出现多线程?原因是De ugLZQ在写一个LINQ综合Demo的时候遇到了多线程 便停下手来整理一下 关于多线程的文章 园子里很多很多 因此关于多线程理

实例讲解.NET多线程执行函数  

  这里为什么会出现多线程?原因是DebugLZQ在写一个LINQ综合Demo的时候遇到了多线程 便停下手来整理一下 关于多线程的文章 园子里很多很多 因此关于多线程理论性的东西 LZ就不去多说了 这篇博文主要是用最简单的例子 总结下多线程调用函数的相关注意点 重点偏向应用和记忆

   多线程调用无参函数

不同线程调用同一个函数 实例讲解.NET多线程执行函数

  using System;

  using System Collections Generic;

  using System Linq;

  using System Text;

  using System Threading;

  namespace 多线程 {

  class Program

  {

  static void Main(string[] args)

  {

  Console WriteLine( 主线程开始 );

  Thread t = new Thread(new ThreadStart(ShowTime));//注意ThreadStart委托的定义形式

  t Start();//线程开始 控制权返回Main线程

  Console WriteLine( 主线程继续执行 );

  //while (t IsAlive == true) ;

  Thread Sleep( );

  t Abort();

  t Join();//阻塞Main线程 直到t终止

  Console WriteLine( );

  Console ReadKey();

  }

  static void ShowTime()

  {

  while (true)

  {

  Console WriteLine(DateTime Now ToString());

  }

  }

  }

  }

  注意ThreadStart委托的定义如下:

  

  可见其对传递进来的函数要求是:返回值void 无参数

   多线程调用带参函数(两种方法)

  using System;

  using System Collections Generic;

  using System Linq;

  using System Text;

  using System Threading;

  namespace 多线程 _带参数 {

  class Program

  {

  static void Main(string[] args)

  {

  Console WriteLine( Main线程开始 );

  Thread t = new Thread(new ParameterizedThreadStart(DoSomething));//注意ParameterizedThreadStart委托的定义形式

  t Start(new string[]{ Hello World });

  Console WriteLine( Main线程继续执行 );

  Thread Sleep( );

  t Abort();

  t Join();//阻塞Main线程 直到t终止

  Console ReadKey();

  }

  static void DoSomething(object  s)

  {

  string[] strs = s as string[];

  while (true)

  {

  Console WriteLine( { } { } strs[ ] strs[ ]);

  }

  }

  }

  }

  注意ParameterizedThreadStart委托的定义如下:

  

  可见其对传入函数的要求是:返回值void 参数个数 参数类型object

  using System;

  using System Collections Generic; u

  sing System Linq;

  using System Text;

  using System Threading;

  namespace 多线程 _带参数 {

  class Program

  {

  static void Main(string[] args)

  {

  Guest guest = new Guest()

  {

  Name= Hello Age=

  };

  Thread t = new Thread(new ThreadStart(guest DoSomething));//注意ThreadStart委托的定义形式

  t Start();

  Thread Sleep( );

  t Abort();

  t Join();//阻塞Main线程 直到t终止

  Console ReadKey();

  }

  }

  //

  class Guest

  {

  public string Name { get; set; }

  public int Age { get; set; }

  public void DoSomething()

  {

  while (true)

  {

  Console WriteLine( { } { } Name Age);

  }

  }

  }

  }

  这个还是使用ThreadStart委托 对方法进行了一个封装

  两种方法 可随意选择 第一种貌似简洁一点

   线程同步

  线程同步的方法有很多很多种volatile Lock InterLock Monitor Mutex ReadWriteLock

  这里用lock说明问题:在哪里同步 用什么同步 同步谁?

  首先感受下不同步会出现的问题:

  

  代码就是下面的代码去掉lock块

  using System;

  using System Collections Generic;

  using System Linq;

  using System Text;

  using System Threading;

  namespace 多线程 _同步 {

  class Program

  {

  static object obj = new object();//同步用

  static int balance = ;

  static void Main(string[] args)

  {

  Thread t = new Thread(new ThreadStart(Credit));

  t Start();

  Thread t = new Thread(new ThreadStart(Debit));

  t Start();

  Console ReadKey();

  }

  static void Credit()

  {

  for (int i = ; i < ; i++)

  {

  lock (obj)

  {

  balance += ;

  Console WriteLine( After crediting balance is { } balance);

  }

  }

  }

  static void Debit()

  {

  for (int i = ; i < ; i++)

  {

  lock (obj)

  {

  balance = ;

  Console WriteLine( After debiting balance is { } balance);

  }

  }

  }

  }

  }

lishixinzhi/Article/program/net/201311/12352  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码