package com.day02;
/**
* @author anyan
* @date 2021/5/8-16:33
*/
/*
蛋糕类
*/
public class Cake {
//蛋糕可以切成num块
private int num;
public Cake() {
}
public Cake(int num) {
this.num = num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
package com.day02;
/**
* @author anyan
* @date 2021/5/8-16:35
*/
/*
学生类
*/
public class Student extends Thread {
//假设蛋糕可以切成12块
Cake cake=new Cake(12);
public Student(Cake cake) {
this.cake = cake;
}
//学生吃蛋糕的方法,某学生对象吃n块
public void eat(int n) throws Exception {
//线程安全。为了使每个学生对象吃蛋糕同步,不并发执行学生线程对象
synchronized(cake) {
//起初蛋糕有t0块
int t0 = cake.getNum();
//学生对象吃完n块后有t1块
int t1 = t0 - n;
Thread.sleep(1000);
//刷新蛋糕块数
cake.setNum(t1);
}
}
//学生开始吃蛋糕
public void run(){
int x=2;
try {
this.eat(x);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(currentThread().getName()+"吃蛋糕成功 剩余块数:"+cake.getNum());
}
}
package com.day02;
/**
* @author anyan
* @date 2021/5/8-16:57
*/
/*
测试学生吃蛋糕
*/
public class Test {
public static void main(String[] args) {
//创建一个蛋糕对象,假设分成12块
Cake cake=new Cake(12);
Cake cake2=new Cake(5);
//创建两个线程对象,即学生对象,并且让其共享同一块蛋糕
Student stu1=new Student(cake);
Student stu2=new Student(cake);
//stu3不参与同一块蛋糕
Student stu3=new Student(cake2);
stu1.setName("anyan");
stu2.setName("ouyang");
stu3.setName("tahuazi");
stu1.start();
stu2.start();
stu3.start();
}
}