本博客仅为个人学习记录,不保证完全准确
实验内容:
(一)通过继承Thread类来创建线程
程序模板:ThreadExample.java
class Tortoise extends Thread { int sleepTime = 0, liveLength = 0; Tortoise(int sleepTime, String name, int liveLength) { this.sleepTime = sleepTime; this.liveLength = liveLength; setName(name); // 设置线程的名字为name } public void run() { while (true) { liveLength--; System.out.print("@"); try { sleep(sleepTime); // 让线程调用sleep方法进入中断状态,sleepTime毫秒后线程重新排队,等待CUP资源 } catch (InterruptedException e) { } if (liveLength <= 0) { System.out.print(getName() + "进入死亡状态n"); return; // 结束run方法的语句 } } } } class Rabbit extends Thread { int sleepTime = 0, liveLength; Rabbit(int sleepTime, String name, int liveLength) { this.sleepTime = sleepTime; this.liveLength = liveLength; setName(name); // 设置线程的名字为name } public void run() { while (true) { liveLength--; System.out.print("*"); try { sleep(sleepTime); // 让线程调用sleep方法进入中断状态,sleepTime毫秒后线程重新排队,等待CUP资源 } catch (InterruptedException e) { } if (liveLength <= 0) { System.out.print(getName() + "进入死亡状态n"); return; // 结束run方法的语句 } } } } public class ThreadExample { public static void main(String args[]) { Rabbit rabit; rabit = new Rabbit(4, "a", 3); // 新建线程rabit Tortoise tortoise; tortoise = new Tortoise(5, "b", 6); // 新建线程tortoise tortoise.start(); // 启动线程tortoise rabit.start(); // 启动线程rabit } }
程序运行结果:
同一个对象不能start()两次的原因是:
线程的状态会被明确的写入其公共内部枚举类型Java.lang.Thread.State中,分别是:新建(NEW),就绪(RUNNABLE),阻塞(BLOCKED),等待(WAITING)计时等待(TIMED_WAIT),终止(TERMINATED)。在第二次调用start() 方法的时候,已经被start的线程已经不再是(NEW)状态了,所以会出错IllegalThreadStateException
(二)通过向Thread()构造方法传递Runnable对象来创建线程
程序模板:ShopExample.java
class Shop implements Runnable { Thread zhangWorker, wangWorker, boss; Shop() { boss = new Thread(this); // 创建boss,Shop对象为boss的目标对象 zhangWorker = new Thread(boss); // 创建zhangWorker,Shop对象为zhangWorker的目标对象 wangWorker = new Thread(boss); // 创建wangWorker,Shop对象为wangWorker的目标对象 zhangWorker.setName("张工"); wangWorker.setName("王工"); boss.setName("老板"); } public void run() { int i = 0; if (Thread.currentThread() == zhangWorker) { while (true) { try { i++; System.out.println(zhangWorker.getName() + "已搬运了" + i + "箱苹果"); if (i == 3) return; Thread.sleep(10000);// zhangWorker休眠10秒(10000毫秒) } catch (InterruptedException e) { System.out.println(boss.getName() + "让" + zhangWorker.getName() + "继续工作"); } } } else if (Thread.currentThread() == wangWorker) { while (true) { try { i++; System.out.println(wangWorker.getName() + "已搬运了" + i + "箱香蕉"); if (i == 3) return; Thread.sleep(10000);// wangWorker休眠10秒(10000毫秒) } catch (InterruptedException e) { System.out.println(boss.getName() + "让" + wangWorker.getName() + "继续工作"); } } } else if (Thread.currentThread() == boss) { while (true) { zhangWorker.interrupt(); // 吵醒zhangWorker wangWorker.interrupt(); // 吵醒wangWorker if (!(wangWorker.isAlive() || zhangWorker.isAlive())) { System.out.println(boss.getName() + "下班"); return; } } } } } class ShopExample { public static void main(String args[]) { Shop shop = new Shop(); shop.zhangWorker.start(); shop.wangWorker.start(); shop.boss.start(); } }
程序运行结果:
两次运行的结果可能会不同,原因是:
shop类内有三个线程,而java中多线程是抢占式运行,优先抢占cpu的cpu就会先分配时间片来运行,所以结果不尽相同
(三)按要求编写程序
1.定义抽象类Animal,定义两个行为吃eat()和移动move();
2.通过继承实现类猫Cat、类狗Dog、类鸟Bird、猎鹰Falcon;
2.1 eat():猫输出“吃鱼。”,狗输出“吃骨头。”,鸟输出“吃虫子。”,猎鹰输出“吃蛇。”
2.2 move(): 猫输出“跳。”,狗输出“跑。”,鸟输出“飞。”,猎鹰输出“飞很高。”
3.定义IPet接口,定义行为Play();
4.实现类PetDog,PetCat,PetRobot;
4.1 Play的行为PetDog 输出“叼飞盘”,PetCat,输出“撸撸猫”,PetRobot,输出“编程玩吧”
4.2 为类PetDog,PetCat添加名字属性Name, 以及get_name和set_name方法
5.生成测试类Stage,在测试类中生成3只狗,2只猫,1只猎鹰,1只鸟,1只宠物狗,1只宠物猫,1只机器宠物;
5.1 为宠物猫和宠物狗取名
5.2生成list列表,用于存放生成的所有动物,通过迭代器遍历列表,让所有动物吃东西eat(),移动move()
5.3 为所有动物增加体重属性,每次吃东西后会增加体重,每个动物体重增加基于种类,且应该是随机的
5.4 按体重为动物排序
5.5 将所有宠物存储在哈希表中,根据用户输入宠物名称,从哈希表中找出相应对象交互play()
import java.util.*; abstract class Animal { private int weight = 5; public int getWeight() { return weight; } public void setWeight(int w) { weight += w; } public abstract void eat(); public abstract void move(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); setWeight((int) (4 + Math.random() * 2)); } public void move() { System.out.println("跳"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); setWeight((int) (6 + Math.random() * 3)); } public void move() { System.out.println("跑"); } } class Bird extends Animal { public void eat() { System.out.println("吃虫子"); setWeight((int) (1 + Math.random() * 2)); } public void move() { System.out.println("飞"); } } class Falcon extends Animal { public void eat() { System.out.println("吃蛇"); setWeight((int) (3 + Math.random() * 2)); } public void move() { System.out.println("飞很高"); } } interface IPet { public void Play(); } class PetCat extends Cat implements IPet { private String Name; public String get_name() { return Name; } void set_name(String name) { Name = name; } public void Play() { System.out.println("撸撸猫"); } } class PetDog extends Dog implements IPet { private String Name; public String get_name() { return Name; } void set_name(String name) { Name = name; } public void Play() { System.out.println("叼飞盘"); } } class PetRobot implements IPet { private String Name; PetRobot(String name) { Name = name; } public String get_name() { return Name; } void set_name(String name) { Name = name; } public void Play() { System.out.println("编程玩吧"); } } public class Stage { public static void main(String a[]) { List animalList = new ArrayList(); for (int i = 0; i < 3; i++) { animalList.add(new Dog()); } for (int i = 0; i < 2; i++) { animalList.add(new Cat()); } animalList.add(new Falcon()); animalList.add(new Bird()); PetDog petdog = new PetDog(); PetCat petcat = new PetCat(); PetRobot petrobot = new PetRobot("阿尔玛狗"); petdog.set_name("旺财"); petcat.set_name("坚果"); animalList.add(petdog); animalList.add(petcat); //通过迭代器遍历列表 Iterator iter = animalList.iterator(); while (iter.hasNext()) { Animal e = (Animal) iter.next(); e.eat(); e.move(); } //按照体重给列表中的动物排序 System.out.println("动物体重排序后:"); Collections.sort(animalList, new Comparator() { public int compare(Animal a1, Animal a2) { return a1.getWeight() - a2.getWeight(); } }); for (Animal e : animalList) { System.out.print(e.getClass().getSimpleName() + ':'); System.out.println(e.getWeight()); } //创建宠物的哈希表 HashMappetHashMap = new HashMap<>(); petHashMap.put(petdog.get_name(), petdog); petHashMap.put(petcat.get_name(), petcat); petHashMap.put(petrobot.get_name(), petrobot); System.out.println("请输入宠物名称:"); Scanner scanner = new Scanner(System.in); String str = scanner.next(); if (petHashMap.containsKey(str)) { petHashMap.get(str).Play(); } } }
运行结果:
本次记录先到这,后续可能会有补充标准答案或者一些东西的用法
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)