线程是指进程内部同时做的事情,比如在玩王者荣耀的时候,你可以同时攻击英雄A和英雄B;
下面将此作为例子,引入三种创建多线程的方式;
例子思路:
①先创建英雄类(Hero)设置三个属性:name(英雄名)、hp(英雄的血量)、damage(攻击力)
两个方法:sttrackHero(); 受到攻击,减少hp、isDead();判断英雄是否阵亡
②创建继承线程类(Thread),并重写线程的run方法;
③分别创建四个英雄(马可波罗、李白、小乔、大乔)对象,创建第一个线程,马可波罗攻击李白;第二个线程,大乔攻击小乔;
方式一:继承线程类(Thread)
①首先创建英雄类(Hero)
package create_thread;
public class Hero {
public String name; //英雄名
public float hp;//血量
public int damage;//攻击伤害;
//进行攻击
public void attrackHero(Hero h){
h.hp-=damage;
//格式化输出
System.out.format("%s正在攻击%s,%s的hp变成了%.0f%n",name,h.name,h.name,h.hp);
if(h.isDead()){
System.out.println(h.name+"败了");
}
}
//判断英雄是否低于0血
public boolean isDead(){
return 0>=hp?true:false;
}
}
②继承线程的KillThread类
package create_thread;
public class KillThread extends Thread{
private Hero h1;
private Hero h2;
public KillThread(Hero h1,Hero h2){
this.h1=h1;
this.h2=h2;
}
public void run(){
//判断英雄是否血量值
while(!h2.isDead()){
h1.attrackHero(h2);
}
}
}
③创建英雄的对象,并启动线程。
package create_thread;
public class TestThread {
public static void main(String [] args){
//创建对象
Hero makeboluo = new Hero();
makeboluo.name="马可波罗";
makeboluo.hp=666;
makeboluo.damage=60;
Hero libai = new Hero();
libai.name="李白";
libai.hp=666;
libai.damage=50;
Hero daqiao = new Hero();
daqiao.name="大乔";
daqiao.hp=666;
daqiao.damage=50;
Hero xiaoqiao = new Hero();
xiaoqiao.name="小乔";
xiaoqiao.hp=666;
xiaoqiao.damage=50;
KillThread killThread1=new KillThread(makeboluo,libai);
//启动线程;
killThread1.start();
KillThread killThread2=new KillThread(daqiao,xiaoqiao);
//启动线程;
killThread2.start();
}
}
方式二:实现Runnable接口
①先实现接口,重写run方法
package create_thread;
//实现Runnable接口
public class KillThread2 implements Runnable{
Hero h1;
Hero h2;
public KillThread2(Hero h1,Hero h2){
this.h1=h1;
this.h2=h2;
}
public void run() {
while(!h2.isDead()){
h1.attrackHero(h2);
}
}
}
②启动是先创建实现Runnable的killThread1对象,再利用该对象去启动线程
package create_thread;
public class TestThread2 {
public static void main(String [] args){
//创建对象
Hero makeboluo = new Hero();
makeboluo.name="马可波罗";
makeboluo.hp=666;
makeboluo.damage=60;
Hero libai = new Hero();
libai.name="李白";
libai.hp=666;
libai.damage=50;
Hero daqiao = new Hero();
daqiao.name="大乔";
daqiao.hp=666;
daqiao.damage=50;
Hero xiaoqiao = new Hero();
xiaoqiao.name="小乔";
xiaoqiao.hp=666;
xiaoqiao.damage=50;
//实现Runnable接口,创建线程的方法
KillThread killThread1=new KillThread(makeboluo,libai);
new Thread(killThread1).start();
KillThread killThread2=new KillThread(daqiao,xiaoqiao);
new Thread(killThread2).start();
}
}
方式三:匿名类
package create_thread;
public class TestThread3 {
public static void main(String[] args) {
//创建对象
Hero makeboluo = new Hero();
makeboluo.name="马可波罗";
makeboluo.hp=666;
makeboluo.damage=60;
Hero libai = new Hero();
libai.name="李白";
libai.hp=666;
libai.damage=50;
Hero daqiao = new Hero();
daqiao.name="大乔";
daqiao.hp=666;
daqiao.damage=50;
Hero xiaoqiao = new Hero();
xiaoqiao.name="小乔";
xiaoqiao.hp=666;
xiaoqiao.damage=50;
//匿名类
Thread t1= new Thread(){
public void run(){
//匿名类中用到外部的局部变量teemo,必须把teemo声明为final
//但是在JDK7以后,就不是必须加final的了
while(!libai.isDead()){
makeboluo.attrackHero(libai);
}
}
};
t1.start();
Thread t2= new Thread(){
public void run(){
while(!xiaoqiao.isDead()){
daqiao.attrackHero(xiaoqiao);
}
}
};
t2.start();
}
}