C#线程基础

暂停线程:

 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();
        }
    }

  

posted @ 2020-05-30 14:56  石shi  阅读(287)  评论(0编辑  收藏  举报