用《捕鱼达人》去理解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技术研讨会在北京举 ...
随机推荐
- mac OSx 安装 mysqlclient
首先需要安装 按照提示操作 brew install mysql-connector-c 然后 修改mysql_config 执行mysql_config可以看到文件所在位置 我的目录放在 /usr ...
- Repeater 实现 OnSelectedIndexChanged
在Repeater中使用DropDownList的方法 在Repeater中使用DropDownList的方法 以下代码并不完整,只记录了关键的方法 aspx代码中 假设这是一个用户管理的系统的模 ...
- Cache Aside Pattern
Cache Aside Pattern 即旁路缓存是缓存方案的经验实践,这个实践又分读实践,写实践 对于读请求 先读cache,再读db 如果,cache hit,则直接返回数据 如果,cache m ...
- Ubuntu16.04彻底删除PHP7.2
一.删除php的相关包及配置 apt-get autoremove php7* 二.删除关联 sudo find /etc -name "*php*" |xargs rm -rf ...
- PHP 面向对象之单例模式-有些类也需要计划生育
一个类只有一个实例对象 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2 ...
- JGit 切换分支
//gitDir是git仓库的根目录,这个仓库必须是已clone好了 File file = new File(gitDir); Git git = Git.open(file); //切换分支, i ...
- IT题库9-线程池的概念和原理
在什么情况下使用线程池? 1.单个任务处理的时间比较短:2.需要处理的任务的数量大: 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销.2.如不使用线程池,有可能造成系统创建 ...
- VS2015右键集成TortoiseGit
先上效果 再说步骤 1.安装VS TortoiseGit等~~ 2.以外部工具方式调用TortoiseGit 3.在VS中设置右键菜单 在菜单栏下方右键,选择自定义 在弹出窗口中选择,命令->上 ...
- 【转】基于Jenkins实现持续集成【持续更新中】
知识预览 持续集成 Jenkins安装 Jenkins插件 Jenkins配置 Jenkins备份与恢复 发布PHP项目 SVN 发布Maven项目 按版本发布 远程管理 War文件部署设置 任务 J ...
- Hadoop大数据学习视频教程 大数据hadoop运维之hadoop快速入门视频课程
Hadoop是一个能够对大量数据进行分布式处理的软件框架. Hadoop 以一种可靠.高效.可伸缩的方式进行数据处理适用人群有一定Java基础的学生或工作者课程简介 Hadoop是一个能够对大量数据进 ...