
本博客仅为个人学习记录,不保证完全准确
实验内容:
(一)通过继承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());
}
//创建宠物的哈希表
HashMap petHashMap = 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条)