|
楼主 |
发表于 2024-4-15 19:33:34
|
显示全部楼层
@FishC1对该代码按要求进行修改(1) 查看运行结果分析后,每个小朋友相当于一个线程,所以先创建一个Littlefriend()方法作为小朋友。
(2) 查看运行结果分析后,创建eating()方法作为小朋友吃饭时的线程,创建playing()方法作为小朋友玩耍时的线程。
(3) 查看运行结果分析后,需要在获取筷子的方法Fork中先定义一个boolean类型的数组,代表5根筷子的使用情况;再使用synchronized线程锁来控制只有左右手的筷子都未被使用时,才允许获取筷子,且必须同时获取左右手筷子。
(4) 查看运行结果分析后,需要在释放左右手筷子的方法putFork中使用synchronized线程锁来释放筷子。
(5) 最后在测试类中调用5次以上方法,代表5位小朋友。
- 小朋友相当于一个线程
- class Child extends Thread{
- private String name;
- private Chopsticks chopsticks;
- public Child(String name,Chopsticks chopsticks){
- super(name);
- this.name=name;
- this.chopsticks=chopsticks;
- }
- public void run(){
- while(true){
- playing();
- chopsticks.takeChopsticks();
- eating();
- chopsticks.putChopsticks();
- }
- }
- public void eating(){
- System.out.println("小朋友"+name+"在吃饭");
- try {
- sleep(1000);//模拟吃饭,占用一段时间
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- public void playing(){
- System.out.println("小朋友"+name+"在玩游戏");
- try {
- sleep(1000);//模拟玩耍,占用一段时间
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- class Chopsticks{
- //5只筷子,初始为都未被用
- private boolean[] used={false,false,false,false,false};
- //只有当左右的筷子都未被使用时,才允许获取筷子,且必须同时获取左右筷子
- public synchronized void takeChopsticks(){
- //请完善程序,获得当前小朋友线程的名字
- String name =Thread.currentThread().getName();
- //请完善程序,获得当前小朋友线程的名字所对应的整数值
- int i =Integer.parseInt(name);
- //请完善程序中的条件,判定当前小朋友左右的筷子是否都未被占用,否则等待
- while(used[i]||used[(i+1)%5]){
- try {
- wait();//如果左右手有一只正被使用,等待
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- used[i ]= true;
- used[(i+1)%5]=true;
- }
- /*必须同时释放左右手的筷子*/
- public synchronized void putChopsticks(){
- String name = Thread.currentThread().getName();
- int i = Integer.parseInt(name);
- //请完善程序,将当前小朋友左右的筷子状态更新为未被占用
- used[i]=false;
- used[(i+1)%5]=false;
- //请完善程序,唤醒所有正在等待的小朋友线程
- notifyAll();
- }
- }
- class Test {
- public static void main(String []args){
- Chopsticks chopsticks = new Chopsticks();
- new Child("0",chopsticks).start();
- //请完善程序,再依次生成四个小朋友线程并启动
- new Child("1",chopsticks).start();
- new Child("2",chopsticks).start();
- new Child("3",chopsticks).start();
- new Child("4",chopsticks).start();
- }
- }
复制代码 |
|