2021-11-23 JAVA上机实验之线程

2021-11-23 JAVA上机实验之线程,第1张

2021-11-23 JAVA上机实验之线程

本博客仅为个人学习记录,不保证完全准确

实验内容:

(一)通过继承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();
		}
	}
}

运行结果:


 本次记录先到这,后续可能会有补充标准答案或者一些东西的用法

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5582411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存