用《捕鱼达人》去理解C#中的多线程
线程是进程中某个单一顺序的控制流,是程序运行中的调度单位,是程序执行流的最小单位,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序进程本身。
一、Thread
class Fish
{
public string Name { get; set; } public Fish()
{
Name = "小黄鱼" ;
} public void Move()
{
Console.WriteLine(string .Format("{0}在游来游去......", Name));
}
} class Program
{
static void Main(string[] args)
{
Fish fish = new Fish();
Thread t1 = new Thread(() =>
{
fish.Move();
});
t1.IsBackground = true;
t1.Start(); Fish fish2 = new Fish() { Name = "大鲨鱼" };
Thread t2 = new Thread(() =>
{
fish2.Move();
});
t2.IsBackground = true;
t2.Start(); Console.ReadKey();
}
}
二、ThreadPool
static void Main(string[] args)
{
Fish fish = new Fish();
Fish fish2 = new Fish() { Name = "大鲨鱼" };
Fish fish3 = new Fish() { Name = "灯笼鱼" };
Fish fish4 = new Fish() { Name = "红鲤鱼" };
Fish fish100 = new Fish() { Name = "灯笼鱼" };
ThreadPool.QueueUserWorkItem(f => { fish.Move(); });
ThreadPool.QueueUserWorkItem(f => { fish2.Move(); });
ThreadPool.QueueUserWorkItem(f => { fish3.Move(); });
ThreadPool.QueueUserWorkItem(f => { fish4.Move(); });
ThreadPool.QueueUserWorkItem(f => { fish100.Move(); });
Console.ReadKey();
}
运行后屏幕如下:
三、Task
class Program
{
static void Main(string[] args)
{
//用来取消小黄鱼线程
CancellationTokenSource cts = new CancellationTokenSource (); Fish fish = new Fish();
Fish fish2 = new Fish() { Name = "大鲨鱼" , Score = }; Task t1 = new Task(() => fish.Move(cts.Token), cts.Token);
t1.Start();
//小黄鱼被击中后显示积分
t1.ContinueWith(fish.ShowScore); Task t2 = new Task(() =>fish2.Move(cts.Token), cts.Token);
t2.Start();
//大鲨鱼鱼被击中后显示积分
t2.ContinueWith(fish2.ShowScore); //按任意键发射
Console.ReadKey(); //武器工厂线程池,执行一组任务
Gun gun = new Gun();
LaserGun laserGun = new LaserGun();
TaskFactory taskfactory = new TaskFactory();
Task[] tasks = new Task[]
{
taskfactory.StartNew(()=>gun.Fire()),
taskfactory.StartNew(()=>laserGun.Fire())
};
//执行武器们开火
taskfactory.ContinueWhenAll(tasks, (Task) => { }); //鱼儿们被击中了就会去调显示积分的方法
cts.Cancel();
Console.ReadLine();
}
} class Fish
{
public string Name { get; set; }
public int Score { get; set; } public Fish()
{
Name = "小黄鱼" ;
Score = ;
} /// <summary>
/// 游动
/// </summary>
public void Move(CancellationToken ct)
{
//如果没有被击中,就一直游阿游,用IsCancellationRequested判断
while (!ct.IsCancellationRequested)
{
Console.WriteLine(string .Format("{0}在游来游去......", Name));
Thread.Sleep();
}
} //中枪死亡后显示奖励
public void ShowScore(Task task)
{
Console.WriteLine(string .Format("{0}中弹了,您得到{1}分......" , Name, Score));
}
} abstract class Weapon
{
public string Name { get; set; }
public abstract void Fire();
} class Gun : Weapon
{
public Gun()
: base()
{
Name = "双射枪" ;
}
public override void Fire()
{
Console.WriteLine(string .Format("咻咻咻,{0}向鱼儿们发射子弹......" , Name));
}
} class LaserGun : Weapon
{
public LaserGun()
: base()
{
Name = "激光炮" ;
}
public override void Fire()
{
Console.WriteLine(string .Format("嗖嗖嗖,{0}向鱼儿们发射炮弹......" , Name));
}
}
用《捕鱼达人》去理解C#中的多线程的更多相关文章
- 以吃货的角度去理解云计算中On-Premise、IaaS、PaaS和SaaS
了解云计算的一定都听过四个“高大上”的概念:On-Premise(本地部署),IaaS(基础设施及服务).PaaS(平台即服务)和SaaS(软件即服务),这几个术语并不好理解.不过,如果你是个吃货,还 ...
- Java的JAVA_HOME、Path、CLASSPATH环境变量小结,可以借助这三个的配置去理解Oracle中的那几个环境变量的配置作用
问题:在哪里都能执行java命令,是和JAVA_HOME变量有关系呢还是path中指定的那个java路径呢?? 刚学Java的时候,很多jdk配置教程都要求设置JAVA_HOME.Path.CLASS ...
- 用《舌尖2》去理解C#中的多态和开闭原则
昨天晚上看了<舌尖上的中国2>第一集,特别的感人,尤其是看到帮别人割麦子的麦客,一亩地开价200,雇主只肯给100,脸上的那种纠结和无可奈何.还有长着大眼睛的跳跳鱼,很可爱,不过最终还是被 ...
- [转载]ArcGIS Engine 中的多线程使用
ArcGIS Engine 中的多线程使用 原文链接 http://anshien.blog.163.com/blog/static/169966308201082441114173/ 一直都想写 ...
- ArcGIS Engine 中的多线程使用
转自原文ArcGIS Engine 中的多线程使用 一直都想写写AE中多线程的使用,但一直苦于没有时间,终于在中秋假期闲了下来.呵呵,闲话不说了,进入正题! 大家都了解到ArcGIS中处理大数据量时速 ...
- ArcGIS Engine 中的多线程使用[转载]
一直都想写写AE中多线程的使用,但一直苦于没有时间,终于在中秋假期闲了下来.呵呵,闲话不说了,进入正题! 大家都了解到ArcGIS中处理大数据量时速度是相当的慢,这时如果你的程序是单线 ...
- JAVA中的数据结构 - 真正的去理解红黑树
一, 红黑树所处数据结构的位置: 在JDK源码中, 有treeMap和JDK8的HashMap都用到了红黑树去存储 红黑树可以看成B树的一种: 从二叉树看,红黑树是一颗相对平衡的二叉树 二叉树--&g ...
- js原生捕鱼达人(三)--完结
先给分享下我写完的效果,github有点卡,我没有压缩代码,不过效果可以看到 https://jasonwang911.github.io/ 转载请注明'转载于Jason齐齐的博客http://www ...
- TOP30专访:捕鱼达人陈昊芝
原文:http://www.csdn.net/article/2012-04-04/313919/1 编者按:3月31日,第四届CocoaChina游戏开发者大会暨Cocos2D-X技术研讨会在北京举 ...
随机推荐
- minikube windows hyperx填坑记
minikube windows hyperx填坑记 安装了一天半,还是没行,先放弃 开始 minikube start --vm-driver=hyperv --hyperv-virtual-swi ...
- Java数组之二维数组
Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...
- Spring AOP capabilities and goals
Spring AOP 是用纯JAVA 实现的. 不需借助JAVA代码在编译处理阶段来实现. Spring 是在运行期实现的.AOP的实现可以在编译,加载,运行三个阶段来实现:Spring AOP 也不 ...
- C# 使用Newtonsoft.Json读写Json文件
{ "CAN": false, "AccCode": 4294901856, "Id": 768, "BPointMove&quo ...
- oracle之数据恢复(delete误删)
ALTER TABLE TA_申请材料表 ENABLE row movement ; flashback table TA_申请材料表 to timestamp to_timestamp('2019- ...
- CentOS 7 部署GitLab
GitLab概述 : 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过 Web 界面进行访问公开的戒者私人项目.Ruby on Rails 是一个可以 ...
- OpenStack-Neutron-VPNaaS-代码
目前juno只支持ipsec的vpn 但是其实稍微修改代码pptp/openvpn/gre也都是可以支持的,下面看看vpn服务的代码流程: 默认我们创建好了ide策略.ipsec策略和vpn服务,因 ...
- 论文阅读(XiangBai——【CVPR2017】Detecting Oriented Text in Natural Images by Linking Segments)
XiangBai——[CVPR2017]Detecting Oriented Text in Natural Images by link Segments 目录 作者和相关链接 方法概括 方法细节 ...
- spring boot + vue + element-ui全栈开发入门——项目部署
前言 常用的部署方式有两种: 1.是把生成好的静态页面放到spring boot的static目录下,与打包后的spring boot项目一起发布,当spring boot运行起来后,自然而然就能访 ...
- CCF CSP 201709-1 打酱油 (贪心)
题目链接:http://118.190.20.162/view.page?gpid=T63 问题描述 试题编号: 201709-1 试题名称: 打酱油 时间限制: 1.0s 内存限制: 256.0MB ...