zoukankan      html  css  js  c++  java
  • 进程与线程浅析(三)之线程三国战斗模拟

    好久没有更新这个系列的文章了,那么书接前文。上一篇文章中已经说了小匹夫是做游戏开发的,光说不练假把式,下面的文章就利用java中的线程来做一个小小的模拟对战的演示好了。

    既然是做游戏开发,游戏背景还是要有的,那么就选择三国题材吧。

    既然是三国,那么就是乱世争天下咯,军队就是必不可少的。

    小匹夫本人喜欢刘备,那么敌人自然就假设是曹操了。

    这里我们使用Runnabel对象启动军队线程来模拟军队的战斗行为。

    //用来创建军队线程,模拟军队战斗
    public class ArmyRunnable implements Runnable{ ...省略若干字}
    
    ArmyRunnable LiuBeiArmyBehav = new ArmyRunnable();
    ArmyRunnable CaoCaoArmyBehav = new ArmyRunnable();
    
    Thread LiuBeiArmy = new Thread(LiuBeiArmyBehav,"刘备军队");
    Thread CaoCaoArmy = new Thread(CaoCaoArmyBehav,"曹操军队");
    

      

    记得曾经听过一个策划高手说过,三国玩什么?玩将呗。那么我们也要引入将领的线程来影响整个战局。

    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 + "人“);
             }
        } 
        
    }    
    

      

    最后,肯定需要一个战场来承载这场战斗咯。不然将军和士兵们怎么能发挥自己的能力呢。

    public class BattleField extends Thread{....}
    

     

    好了,我们需要的对象都大体介绍清楚了,接下来就先从军队开始搞起吧。

    首先新建一个java工程取名为ThreeKindoms。

    工程创建好之后,再创建一个包用来承载代码,我取名为com.fanyoy.threekindoms。

    接下来,我们就可以进入今天的主题了,军队类的创建。由于实现了Runnable接口,所以我们创建该class时选择需要选择Runnable

    下面就是ArmyRunnable的实现了。

    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方法中,实例化曹操和刘备军的线程,当军队线程启动完毕,则战场线程的任务告一段落,为了不影响军队线程,则需要使战场线程先休眠。当达到一定条件时,鸣金收兵,结束战斗。

    最后则放上这场战斗的战况吧~

    下周继续~~~

  • 相关阅读:
    C#删除只读文件
    在超链接href中实现form的提交
    C#中复制数组
    C#判断字符串中是否包含一个子字符串是可以直接使用Contains()方法
    C#使用System.xml.linq来生成XML文件
    C# 获取SHA256码
    C#中要使ListBox使用AddRange()时,能够触发SelectedValueChanged事件
    报错:[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop bei
    elementUI el-select 中disabled设置
    实现element-ui中table点击一行展开
  • 原文地址:https://www.cnblogs.com/murongxiaopifu/p/4133554.html
Copyright © 2011-2022 走看看