1.使用Runnable和Thread完成线程创建和基本操作

时间:2022-02-15 17:33:22

利用《倚天屠龙记》中光明顶之战来完成线程的创建及线程的基本操作

  • GuangMingDing.java:舞台线程
  • HeroThread.java:六大门派线程
  • SchoolRunnable.java:英雄线程(就是张无忌啦)

Runnable和Thread

@FunctionalInterface
public interface RunnableRunnable接口应由任何类实现,其实例将由线程执行。 该类必须定义一个无参数的方法,称为run 。
该接口旨在为希望在活动时执行代码的对象提供一个通用协议。 例如, Runnable由Thread类Thread 。 活跃的只是意味着一个线程已经启动,还没有被停止。

另外, Runnable提供了一个类被激活而不是Thread Thread类化的Thread 。 一个实现类Runnable可以在不继承运行Thread实例化一个Thread实例,并在传递本身作为目标。 在大多数情况下, Runnable接口应使用,如果你只打算重写run()方法并没有其他Thread方法。 这是重要的,因为类不应该被子类化,除非程序员打算修改或增强类的基本行为。

//门派线程
//模拟作战双方的行为
public class SchoolRunnable implements Runnable {

//volatile保证了线程可以正确的读取其他线程写入的值
//可见性 ref JMMhappens-before原则
volatile boolean keepRunning = true;
@Override
public void run() {
while(keepRunning){
//发动5连击
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"进攻对方["+i+"]");
//让出了处理器时间,下次该谁进攻还不一定呢!
Thread.yield();
}
}
System.out.println(Thread.currentThread().getName()+"结束了战斗!");
}

//英雄线程
public class HeroThread extends Thread {

public void run(){
System.out.println(Thread.currentThread().getName()+"开始了战斗!");
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"打败六大门派。。。");
}
System.out.println(Thread.currentThread().getName()+"结束了战斗!");
}
}

//舞台(光明顶)线程
/**
* 光明顶激战大戏
*/
public class GuangMingDing extends Thread {

public void run(){

System.out.println("光明顶之战马上开始");
//让观众们安静片刻,等待大戏上演
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("大幕徐徐拉开");

try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}

System.out.println("六大门派围攻光明顶...");

SchoolRunnable MingSchool = new SchoolRunnable();
SchoolRunnable SixSchool= new SchoolRunnable();

//使用Runnable接口创建线程
Thread MingSchoolThread = new Thread(MingSchool,"明教");
Thread SixSchoolThread= new Thread(SixSchool,"六大门派");

//启动线程,让武林人士开始作战
MingSchoolThread.start();
SixSchoolThread.start();

//舞台线程休眠,大家专心观看军队厮杀
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("正当双方激战正酣,张无忌闪亮登场。。。");

Thread mrZhang = new HeroThread();
mrZhang.setName("张无忌");

System.out.println("张无忌的理想就是天下太平,跟赵敏比翼双飞!");

//停止作战
//停止线程的方法
MingSchool.keepRunning = false;
SixSchool.keepRunning = false;

try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}

/*
* 历史大戏留给关键人物
*/
mrZhang.start();

//万众瞩目,所有线程等待程先生完成历史使命
try {
mrZhang.join();
} catch (InterruptedException e) {
e.printStackTrace();
}


System.out.println("光明顶之战结束,张无忌成了教主!");
System.out.println("谢谢观看血战光明顶,再见!");

}

public static void main(String[] args) {
new GuangMingDing().start();

}
}

输出样例

光明顶之战马上开始
大幕徐徐拉开
六大门派围攻光明顶…
明教进攻对方[0]
明教进攻对方[1]
六大门派进攻对方[0]
六大门派进攻对方[1]
六大门派进攻对方[2]
明教进攻对方[2]
明教进攻对方[3]
明教进攻对方[4]
明教进攻对方[0]
六大门派进攻对方[3]
六大门派进攻对方[4]
明教进攻对方[1]
明教进攻对方[2]
……
……
明教进攻对方[1]
明教进攻对方[2]
明教进攻对方[3]
正当双方激战正酣,张无忌闪亮登场。。。
明教进攻对方[4]
明教进攻对方[0]
明教进攻对方[1]
明教进攻对方[2]
明教进攻对方[3]
明教进攻对方[4]
六大门派进攻对方[1]
明教进攻对方[0]
明教进攻对方[1]
张无忌的理想就是天下太平,跟赵敏比翼双飞!
六大门派进攻对方[2]
六大门派进攻对方[3]
明教进攻对方[2]
六大门派进攻对方[4]
六大门派结束了战斗!
明教进攻对方[3]
明教进攻对方[4]
明教结束了战斗!
张无忌开始了战斗!
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌打败六大门派。。。
张无忌结束了战斗!
光明顶之战结束,张无忌成了教主!
谢谢观看血战光明顶,再见!