Java第十次作业 李新磊
Java第十次作业--多线程
(一)学习总结
1.用思维导图对java多线程的学习内容进行总结。

2.阅读程序,采用实现Runnable接口的方式用多线程实现这个小游戏
package test;
class Tortoise implements Runnable {
private int totalStep;
private int tortoiseStep = 0;
public Tortoise(int totalStep) {
this.totalStep = totalStep;
}
public void run() {
running();
}
private synchronized void running() {
System.out.println("龟兔赛跑开始了...");
while (tortoiseStep < totalStep) {
tortoiseStep++;
System.out.println("乌龟跑了" + tortoiseStep + "步...");
}
}
}
class Hare implements Runnable {
private int totalStep;
private int hareStep = 0;
public Hare(int totalStep) {
this.totalStep = totalStep;
}
private synchronized void running() {
boolean[] flags = { true, false };
while (hareStep < totalStep) {
boolean isHareSleep = flags[((int) (Math.random() * 10)) % 2];
if (isHareSleep) {
System.out.println("兔子睡着了zzzz");
} else {
hareStep += 2;
System.out.println("兔子跑了" + hareStep + "步...");
}
}
}
public void run() {
running();
}
}
public class Test {
public static void main(String[] args) {
Tortoise tortoise = new Tortoise(10);
Hare hare = new Hare(10);
Thread tortoiseThread = new Thread(tortoise);
Thread hareThread = new Thread(hare);
tortoiseThread.start();
hareThread.start();
}
}
- 修改后运行结果
龟兔赛跑开始了...
乌龟跑了1步...
乌龟跑了2步...
乌龟跑了3步...
乌龟跑了4步...
乌龟跑了5步...
兔子跑了2步...
兔子跑了4步...
兔子跑了6步...
兔子跑了8步...
乌龟跑了6步...
兔子跑了10步...
乌龟跑了7步...
乌龟跑了8步...
乌龟跑了9步...
乌龟跑了10步...
3.下面的程序是模拟了生产者——消费者问题,生产者生产10个数,消费者依次消费10个数,运行程序,看结果是否正常?存在什么问题?说明原因。
- 运行结果
消费者开始消耗整数......
生产者开始生产整数......
生产者设定 (1)
生产者设定 (2)
生产者设定 (3)
生产者设定 (4)
生产者设定 (5)
生产者设定 (6)
生产者设定 (7)
生产者设定 (8)
生产者设定 (9)
生产者设定 (10)
消费者取走 (10)
消费者取走 (10)
消费者取走 (10)
消费者取走 (10)
消费者取走 (10)
消费者取走 (10)
消费者取走 (10)
消费者取走 (10)
消费者取走 (10)
消费者取走 (10)
- 错误原因:未进行代码的同步与唤醒
修改后代码
class Clerk {
private int product = -1; // -1 表示目前没有产品
private int p ;
// 这个方法由生产者呼叫
public synchronized void setProduct(int product) {
if (this.product != -1) {
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.product = product;
p = this.product;
System.out.printf("生产者设定 (%d)%n", this.product);
getProduct();
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.product = -1;
super.notify();
}
// 这个方法由消费者呼叫
public synchronized int getProduct() {
if (this.product == -1) {
try {
super.wait();
}catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("消费者取走 (%d)%n", p);
this.product = -1;
super.notify();
return this.product;
}
}
- 修改后运行结果
消费者开始消耗整数......
生产者开始生产整数......
生产者设定 (1)
消费者取走 (1)
生产者设定 (2)
消费者取走 (2)
生产者设定 (3)
消费者取走 (3)
生产者设定 (4)
消费者取走 (4)
生产者设定 (5)
消费者取走 (5)
生产者设定 (6)
消费者取走 (6)
生产者设定 (7)
消费者取走 (7)
生产者设定 (8)
消费者取走 (8)
生产者设定 (9)
消费者取走 (9)
生产者设定 (10)
消费者取走 (10)
(二)实验总结
1.分发作业
程序设计思路
创建一个分发作业类(back),继承Runnable接口,实现线程分发作业功能;
创建一个Test类,在Test类中启动线程。
2.银行存款
程序设计思路
创建银行类(Bank),继承Runnable接口,实现线程存款功能;
创建用户类(User),包含存款功能;
创建Test类,在Test类中启动线程。
问题1.存款功能的实现
class User implements Runnable {
Bank bank = new Bank();
public synchronized void run(){
int num = 3;
while(num >0){
num--;
try{
Thread.sleep(300);
}catch(InterruptedException e){}
System.out.println( Thread.currentThread().getName()+bank.save());
}
}
}
class Bank {
private int money = 0;
public String save() {
setMoney(getMoney()+100); //运用get、set方法,使得每次执行save时,余额加100
return "\t存入 :100元"+"\t余额:"+money+"元";
}
public void setMoney(int money) {
this.money = money;
}
}
(三)代码托管

浙公网安备 33010602011771号