C#线程基础
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#线程基础,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7679字,纯文字阅读大概需要11分钟。
内容图文
![C#线程基础](/upload/InfoBanner/zyjiaocheng/631/959338dfe5b548678bd0904784eff121.jpg)
暂停线程:
static void Main(string[] args) { Thread thread = new Thread(Common.PrintNumbersWithDelay); thread.Start(); Common.PrintNumbers(); Console.ReadKey(); }
等待线程:
Thread thread = new Thread(Common.PrintNumbersWithDelay); thread.Start(); // 等待线程 thread.Join(); Console.WriteLine("打印完成!"); Console.ReadKey();
终止线程:
static void Main(string[] args) { Console.WriteLine("主线程开始..."); //创建一个子线程并启动 Thread t = new Thread(Common.PrintNumbersWithDelay); t.Start(); // 主线程暂停6秒 Thread.Sleep(TimeSpan.FromSeconds(6)); // 终止子线程t t.Abort(); Console.WriteLine("子线程终止了..."); Thread t1 = new Thread(Common.PrintNumbers); t1.Start(); Common.PrintNumbers(); Console.ReadKey(); }
检测线程状态:
static void Main(string[] args) { Thread t1 = new Thread(Common.PrintNumbersWithStatus); t1.Name = "t1"; Thread t2 = new Thread(DoNothing); t2.Name = "t2"; Console.WriteLine($"线程{t1.Name}的状态是:{t1.ThreadState.ToString()}"); Console.WriteLine($"线程{t2.Name}的状态是:{t2.ThreadState.ToString()}"); t1.Start(); t2.Start(); for (int i = 0; i < 30; i++) { Console.WriteLine($"线程{t1.Name}的状态是:{t1.ThreadState.ToString()}"); } Thread.Sleep(TimeSpan.FromSeconds(4)); t1.Abort(); Console.WriteLine($"线程{t1.Name}的状态是:{t1.ThreadState.ToString()}"); Console.WriteLine($"线程{t2.Name}的状态是:{t2.ThreadState.ToString()}"); Console.ReadKey(); } static void DoNothing() { Thread.Sleep(TimeSpan.FromSeconds(2)); }
线程优先级:
class Program { static void Main(string[] args) { Console.WriteLine($"主线程{Thread.CurrentThread.Name}的优先级是{Thread.CurrentThread.Priority}"); Console.WriteLine("在所有CPU内核上运行线程"); RunThreads(); Thread.Sleep(TimeSpan.FromSeconds(3)); Console.WriteLine("在一个CPU内核上运行线程"); Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1); RunThreads(); Console.ReadKey(); } static void RunThreads() { ThreadSample sample = new ThreadSample(); Thread t1 = new Thread(sample.CountNumbers); t1.Name = "t1"; Thread t2 = new Thread(sample.CountNumbers); t2.Name = "t2"; t1.Priority = ThreadPriority.Highest; t2.Priority = ThreadPriority.Lowest; t1.Start(); t2.Start(); Thread.Sleep(TimeSpan.FromSeconds(2)); sample.Stop(); } } class ThreadSample { private bool _isStopped = false; public void Stop() { _isStopped = true; } public void CountNumbers() { long count = 0; while(!_isStopped) { count++; } Console.WriteLine($"线程{Thread.CurrentThread.Name}的优先级是{Thread.CurrentThread.Priority},计数器的值为{count}"); } }
前后台线程:
class Program { static void Main(string[] args) { var sampleForeground = new ThreadSample(10); var sampleBackground = new ThreadSample(20); // 区别:进程会等待所有的前台线程完成后再结束工作,但是如果最后只剩下后台线程,则会直接结束工作 var t1 = new Thread(sampleForeground.CountNumbers); t1.Name = "前台线程"; var t2 = new Thread(sampleBackground.CountNumbers); t2.Name = "后台线程"; t2.IsBackground = true; t1.Start(); t2.Start(); } } class ThreadSample { private readonly int _count; public ThreadSample(int count) { _count = count; } public void CountNumbers() { for (int i = 0; i < _count; i++) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); Console.WriteLine($"{Thread.CurrentThread.Name} 输出 {i}"); } } }
线程传递参数:
class Program { static void Main(string[] args) { var sample = new ThreadSample(10); var t1 = new Thread(sample.CountNumbers); t1.Name = "t1"; t1.Start(); t1.Join(); Console.WriteLine("==================================="); var t2 = new Thread(Count); t2.Name = "t2"; t2.Start(8); t2.Join(); Console.WriteLine("==================================="); // 使用lambda表达式引用另一个C#对象的方式被称为闭包 var t3 = new Thread(() => { CountNumbers(9); }); t3.Name = "t3"; t3.Start(); t3.Join(); Console.WriteLine("==================================="); // 在lambda表达式中使用任何局部变量时,C#会生成一个类,并将该变量作为该类的一个属性 // 共享该变量值 int i = 10; var t4 = new Thread(() => { PrintNumbers(i); }); t4.Name = "t4"; i = 12; var t5 = new Thread(() => { PrintNumbers(i); }); t5.Name = "t4"; t4.Start(); t5.Start(); Console.ReadKey(); } static void CountNumbers(int count) { for (int i = 0; i < count; i++) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); Console.WriteLine($"线程{Thread.CurrentThread.Name}输出{i}"); } } static void Count(object obj) { CountNumbers((int)obj); } static void PrintNumbers(int number) { Console.WriteLine($"线程{Thread.CurrentThread.Name}输出{number}"); } } class ThreadSample { private readonly int _count; public ThreadSample(int count) { _count = count; } public void CountNumbers() { for (int i = 0; i < _count; i++) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); Console.WriteLine($"{Thread.CurrentThread.Name} 输出 {i}"); } } }
Lock:
public abstract class CounterBase { public abstract void Increase(); public abstract void Decrease(); }
public class CounterNoLock : CounterBase { public int Count { get; private set; } public override void Decrease() { Count--; } public override void Increase() { Count++; } }
public class CounterWithLock : CounterBase { public int Count { get; private set; } private readonly object _syncObj = new object(); public override void Decrease() { lock(_syncObj) { Count--; } } public override void Increase() { lock (_syncObj) { Count++; } } }
class Program { static void Main(string[] args) { CounterNoLock counterNoLock = new CounterNoLock(); Thread t1 = new Thread(() => { TestCounter(counterNoLock); }); t1.Name = "t1"; Thread t2 = new Thread(() => { TestCounter(counterNoLock); }); t2.Name = "t2"; Thread t3 = new Thread(() => { TestCounter(counterNoLock); }); t3.Name = "t3"; t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine($"没有锁的计数器结果:{counterNoLock.Count}"); CounterWithLock counterWithLock = new CounterWithLock(); Thread tt1 = new Thread(() => { TestCounter(counterNoLock); }); tt1.Name = "tt1"; Thread tt2 = new Thread(() => { TestCounter(counterNoLock); }); tt2.Name = "tt2"; Thread tt3 = new Thread(() => { TestCounter(counterNoLock); }); tt3.Name = "tt3"; tt1.Start(); tt2.Start(); tt3.Start(); tt1.Join(); tt2.Join(); tt3.Join(); Console.WriteLine($"有锁的计数器结果:{counterWithLock.Count}"); Console.ReadKey(); } static void TestCounter(CounterBase counter) { for (int i = 0; i < 100000; i++) { counter.Increase(); counter.Decrease(); } } }
Monitor
public class Player { public string Name { get; private set; } public int Atk { get; private set; } public Player(string name, int atk) { Name = name; Atk = atk; } public void Attack(YaoGuai yaoGuai) { while(yaoGuai.Blood > 0) { Console.WriteLine($"我是{Name},我来打妖怪~"); yaoGuai.BeAttacked(Atk); } } }
public class PlayerWithMonitor { public string Name { get; private set; } public int Atk { get; private set; } public PlayerWithMonitor(string name, int atk) { Name = name; Atk = atk; } public void Attack(YaoGuai yaoGuai) { while (yaoGuai.Blood > 0) { Monitor.Enter(yaoGuai); Console.WriteLine($"我是{Name},我来打妖怪~"); yaoGuai.BeAttacked(Atk); Monitor.Exit(yaoGuai); } } }
public class YaoGuai { public int Blood { get; private set; } public YaoGuai(int blood) { Blood = blood; Console.WriteLine($"我是妖怪,我有{Blood}滴血!"); } public void BeAttacked(int attack) { if (Blood > 0) { Blood = Blood - attack; if (Blood < 0) { Blood = 0; } } Console.WriteLine($"我是妖怪,我剩余{Blood}滴血!"); } }
class Program { static void Main(string[] args) { YaoGuai yaoGuai = new YaoGuai(1000); Player p1 = new Player("孙悟空", 300); Player p2 = new Player("猪八戒", 180); Thread t1 = new Thread(() => { p1.Attack(yaoGuai); }); Thread t2 = new Thread(() => { p2.Attack(yaoGuai); }); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine("==============================="); YaoGuai yaoGuai2 = new YaoGuai(1000); PlayerWithMonitor p3 = new PlayerWithMonitor("孙悟空", 300); PlayerWithMonitor p4 = new PlayerWithMonitor("猪八戒", 180); Thread t3 = new Thread(() => { p3.Attack(yaoGuai2); }); Thread t4 = new Thread(() => { p4.Attack(yaoGuai2); }); t3.Start(); t4.Start(); t3.Join(); t4.Join(); Console.ReadKey(); } }
内容总结
以上是互联网集市为您收集整理的C#线程基础全部内容,希望文章能够帮你解决C#线程基础所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。