进程与线程浅析(三)之线程三国战斗模拟
好久没有更新这个系列的文章了,那么书接前文。上一篇文章中已经说了小匹夫是做游戏开发的,光说不练假把式,下面的文章就利用java中的线程来做一个小小的模拟对战的演示好了。
既然是做游戏开发,游戏背景还是要有的,那么就选择三国题材吧。
既然是三国,那么就是乱世争天下咯,军队就是必不可少的。
小匹夫本人喜欢刘备,那么敌人自然就假设是曹操了。
这里我们使用Runnabel对象启动军队线程来模拟军队的战斗行为。
1 2 3 4 5 6 7 8 | //用来创建军队线程,模拟军队战斗 public class ArmyRunnable implements Runnable{ ...省略若干字} ArmyRunnable LiuBeiArmyBehav = new ArmyRunnable(); ArmyRunnable CaoCaoArmyBehav = new ArmyRunnable(); Thread LiuBeiArmy = new Thread(LiuBeiArmyBehav, "刘备军队" ); Thread CaoCaoArmy = new Thread(CaoCaoArmyBehav, "曹操军队" ); |
记得曾经听过一个策划高手说过,三国玩什么?玩将呗。那么我们也要引入将领的线程来影响整个战局。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class HeroThread extends Thread{ public HeroThread(String name){ super (name); } @Override public void run(){ System.out.println(Thread.currentThread().getName() + "来也!" ); for ( int i = 0 ; i < 5 ; i++){ System.out.println(Thread.currentThread().getName() + "斩" + i + "人“); } } } |
最后,肯定需要一个战场来承载这场战斗咯。不然将军和士兵们怎么能发挥自己的能力呢。
1 | public class BattleField extends Thread{....} |
好了,我们需要的对象都大体介绍清楚了,接下来就先从军队开始搞起吧。
首先新建一个java工程取名为ThreeKindoms。
工程创建好之后,再创建一个包用来承载代码,我取名为com.fanyoy.threekindoms。
接下来,我们就可以进入今天的主题了,军队类的创建。由于实现了Runnable接口,所以我们创建该class时选择需要选择Runnable
下面就是ArmyRunnable的实现了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package com.fanyoy.threekindoms; /* * by fanyoycreative chenjd */ public class ArmyRunnable implements Runnable { // 刘备和曹操军队的线程 volatile boolean attacking; @Override public void run() { // TODO Auto-generated method stub while (attacking) { //若无军令使attacking为false,则持续进攻10次 for ( int i = 0 ; i< 10 ; i++) { System.out.println(Thread.currentThread().getName() + "第" + i + "几次进攻" ); //让出CPU,不能光自己打,敌人也得还手啊是不。 Thread.yield(); } } //循环结束后提示进攻结束 System.out.println(Thread.currentThread().getName() + "结束战斗" ); } } |
需要注意的是,attacking这里使用volatile修饰符,表示多线程应用中被几个任务共享的变量,这样就能保证线程可以正确的读取其他线程写入的值。因为attacking是由外部线程来修改进而控制军队行为的,就像是军令是由将军下达,而非军队自己下达是一个道理。
有了军队,还需要什么呢?将军?NO!战场?binggo!
下面我们来创建承载这场战斗的战场吧~
可以看到,这次由于BattleFiled继承自Thread类,所以我们选中java.lang.Thread,我们的BattleFiled类就建好了。这里我们实现了BattleFiled的main方法,因为我们需要在main方法中实现测试。之后在战场的run方法中,实例化曹操和刘备军的线程,当军队线程启动完毕,则战场线程的任务告一段落,为了不影响军队线程,则需要使战场线程先休眠。当达到一定条件时,鸣金收兵,结束战斗。
最后则放上这场战斗的战况吧~
下周继续~~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)