C#线程基础
2021-01-03 01:28
标签:incr 暂停 etc 基础 for bst 打印 counter new t 暂停线程: 等待线程: 终止线程: 检测线程状态: 线程优先级: 前后台线程: 线程传递参数: Lock: Monitor C#线程基础 标签:incr 暂停 etc 基础 for bst 打印 counter new t 原文地址:https://www.cnblogs.com/sunliyuan/p/12992701.html 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
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
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
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
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
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#线程同步