创建多线程 - 图1

    三种方法:

    • 继承线程类,一个类表示一个线程

    Hero

    1. import java.io.Serializable;
    2. public class Hero{
    3. public String name;
    4. public float hp;
    5. public int damage;
    6. public void attackHero(Hero h) {
    7. try {
    8. //为了表示攻击需要时间,每次攻击暂停1000毫秒
    9. Thread.sleep(1000);
    10. } catch (InterruptedException e) {
    11. // TODO Auto-generated catch block
    12. e.printStackTrace();
    13. }
    14. h.hp-=damage;
    15. System.out.format("%s 正在攻击 %s, %s的血变成了 %.0f%n",name,h.name,h.name,h.hp);
    16. if(h.isDead())
    17. System.out.println(h.name +"死了!");
    18. }
    19. public boolean isDead() {
    20. return 0>=hp?true:false;
    21. }
    22. }

    KillThread

    public class KillThread extends Thread{
        Hero h1;
        Hero h2;
    
        public KillThread(Hero a, Hero b){
            h1 = a;
            h2 = b;
        }
    
        public void run(){
            while(!h2.isDead()){
                h1.attackHero(h2);
            }
        }
    }
    

    Test.java

    import java.io.*;
    
    public class Test {
        public static void main(String[] args) {
            Hero gareen = new Hero();
            gareen.name = "盖伦";
            gareen.hp = 616;
            gareen.damage = 50;
    
            Hero teemo = new Hero();
            teemo.name = "提莫";
            teemo.hp = 300;
            teemo.damage = 30;
    
            Hero bh = new Hero();
            bh.name = "赏金猎人";
            bh.hp = 500;
            bh.damage = 65;
    
            Hero leesin = new Hero();
            leesin.name = "盲僧";
            leesin.hp = 455;
            leesin.damage = 80;
    
            KillThread killThread1 = new KillThread(gareen, teemo);
            killThread1.start();
    
            KillThread killThread2 = new KillThread(bh, leesin);
            killThread2.start();
        }
    }
    

    输出

    盖伦 正在攻击 提莫, 提莫的血变成了 250
    赏金猎人 正在攻击 盲僧, 盲僧的血变成了 390
    盖伦 正在攻击 提莫, 提莫的血变成了 200
    赏金猎人 正在攻击 盲僧, 盲僧的血变成了 325
    盖伦 正在攻击 提莫, 提莫的血变成了 150
    赏金猎人 正在攻击 盲僧, 盲僧的血变成了 260
    盖伦 正在攻击 提莫, 提莫的血变成了 100
    赏金猎人 正在攻击 盲僧, 盲僧的血变成了 195
    赏金猎人 正在攻击 盲僧, 盲僧的血变成了 130
    盖伦 正在攻击 提莫, 提莫的血变成了 50
    赏金猎人 正在攻击 盲僧, 盲僧的血变成了 65
    盖伦 正在攻击 提莫, 提莫的血变成了 0
    提莫死了!
    赏金猎人 正在攻击 盲僧, 盲僧的血变成了 0
    盲僧死了!
    
    • Runable 接口

    用一个类实现 Runable 接口,重写 run 方法, 然后在根据这个类的对象创建线程对象并启动

    Battle battle1 = new Battle(gareen,teemo);
    new Thread(battle1).start();
    Battle battle2 = new Battle(bh,leesin);
    new Thread(battle2).start();
    
    • 匿名类 ```java public class TestThread {

      public static void main(String[] args) {

        Hero gareen = new Hero();
        gareen.name = "盖伦";
        gareen.hp = 616;
        gareen.damage = 50;
      
        Hero teemo = new Hero();
        teemo.name = "提莫";
        teemo.hp = 300;
        teemo.damage = 30;
      
        Hero bh = new Hero();
        bh.name = "赏金猎人";
        bh.hp = 500;
        bh.damage = 65;
      
        Hero leesin = new Hero();
        leesin.name = "盲僧";
        leesin.hp = 455;
        leesin.damage = 80;
      
        //匿名类
        Thread t1= new Thread(){
            public void run(){
                //匿名类中用到外部的局部变量teemo,必须把teemo声明为final
                //但是在JDK7以后,就不是必须加final的了
                while(!teemo.isDead()){
                    gareen.attackHero(teemo);
                }              
            }
        };
      
        t1.start();
      
        Thread t2= new Thread(){
            public void run(){
                while(!leesin.isDead()){
                    bh.attackHero(leesin);
                }              
            }
        };
        t2.start();
      

      }

    } ```