ALL > Computer and Education > courses > university courses > undergraduate courses > Operating System > zstu-(2021-2022)-1 > student homework directories > 2019329621035张浩严 >
2019329621035_张浩严_homework5 Version 0
👤 Author: by 2351505710qqcom 2021-12-26 16:22:25
问题:“吃水果”问题
1.实现多进程的创建、进程间同步与互斥解决具体问题。
2.问题描达:桌上有一盘子,桌上有一个空盘,允许存放一只水果,爸爸可向盘内放苹果,妈妈可向盘内放桔子,儿子专等吃盘内的桔子,女儿专等吃盘中的苹果。3.桌上有一盘子,桌上有一个空盘,允许存放一只水果,爸爸可向盘内放苹果,妈妈可向盘内放桔子,儿子专等吃盘内的桔子,女儿专等吃盘中的苹果。
思路:
父亲和母亲要往盘子里放水果,但盘子里只能有一个水果,为了避免冲突,设置diskEmptySemaphore来标记盘子,当盘子为空时,父亲或者母亲可以放水果,
反之不可。父亲线程在执行放水果的任务时,首先利用MaindiskEmptySsemaphore.acquirel请求线程量,此时semaphore已被父亲请求,母亲则请求不到,不能执行,与此同时,父亲线程会通过thaveApplesemaphorerelease()释放女儿线程所需情趣的线程量,女儿线程通过haveAppleSemaphore.acquire()请求线程量,吃完水果后,女儿线程通过Main.diskEmptySemphore.release()释放父亲线程的线程量。

在此过程中,父亲线程和母亲线程之间就属于是互斥关系:

JAVA实现:
package com.company;

import java.util.concurrent.Semaphore;

public class Main {

//初始化桌子为空的信号量为1,使父亲和母亲的线程能运行,1:桌子为空 0:桌子不为空
public static Semaphore diskEmptySemaphore = new Semaphore(1);
//初始化信号量为0,使儿子和女儿线程阻塞
public static Semaphore haveOrangeSemaphore = new Semaphore(0);
public static Semaphore haveAppleSemaphore = new Semaphore(0);


public static void main(String[] args) {
Farther farther = new Farther();
Mother mother = new Mother();
Son son = new Son();
Daughter daughter = new Daughter();

farther.start();
mother.start();
son.start();
daughter.start();
}
}
class Disk {

private static String fruit = "";

public static void putFruit(String role, String fruitName) {
fruit = fruitName;
System.out.println(role + "往盘子里放入了一个" + fruit);
}

public static String getFruit(String role) {
System.out.println(role + "吃了一个" + fruit);
return fruit;
}
}
class Farther extends Thread {

String name = "父亲";

@Override
public void run() {
try {
while(true) {
Main.diskEmptySemaphore.acquire();
Disk.putFruit(name,"苹果");

sleep(1000);

Main.haveAppleSemaphore.release();
}
} catch (InterruptedException e) {

}
}
}
class Daughter extends Thread{

private String name = "女儿";

@Override
public void run() {
try {
while(true) {
Main.haveAppleSemaphore.acquire();
Disk.getFruit(name);

sleep(1000);

Main.diskEmptySemaphore.release();
}
} catch (InterruptedException e) {

}
}
}
class Mother extends Thread {

String name = "母亲";

@Override
public void run() {
try {
while(true) {
Main.diskEmptySemaphore.acquire();
Disk.putFruit(name,"桔子");

sleep(1000);

Main.haveOrangeSemaphore.release();
}
} catch (InterruptedException e) {

}
}
}
class Son extends Thread{

private String name = "儿子";

@Override
public void run() {
try {
while(true) {
Main.haveOrangeSemaphore.acquire();
Disk.getFruit(name);

sleep(1000);

Main.diskEmptySemaphore.release();
}
} catch (InterruptedException e) {

}
}
}

Please login to reply. Login

Reversion History

Loading...
No reversions found.