java

位置:IT落伍者 >> java >> 浏览文章

哲学家进餐问题,java实现


发布日期:2021年08月08日
 
哲学家进餐问题,java实现

public class Scientist extends Thread {

/*

* @authorBore

* @mailz

* @time//

* 哲学家进餐个哲学家只筷子

* 哲学家通过getChopsticks()方法来取筷子

* 当哲学家同时获得左边和右边两只筷子后才可以进餐否则把已经得到的筷子也释放

* 如果一直筷子也没有进程阻塞等待其他哲学家释放资源

* 进程后释放已经获得的资源

*/

static byte[] chopsticks={};//五只筷子

public Scientist(String name){

super(name);

}

public void run() {

getChopsticks();

}

public void getChopsticks(){//开始抢筷子

int tem=IntegerparseInt(thisgetName()substring());//获取哲学家编号

if(tem==){//如果是第一位科学家先抢左边的筷子

if(leftChopsticks(tem)){//如何获取了左边的筷子

if(rightChopsticks(tem)){//如果获取了右边的筷子

eating();//开始吃饭

freeLeftChopsticks(tem);//释放左边筷子

freeRightChopsticks(tem);//释放右边筷子

}else{

freeLeftChopsticks(tem);

Systemoutprintln(由于+thisgetName()+无法获得右手边的筷子所以他把已获得的左手的筷子也释放了!);

try {

thissleep();

} catch (InterruptedException e) {

eprintStackTrace();

}

getChopsticks();

}

}else{

Systemoutprintln(thisgetName()+暂时无法获取两只筷子准备休眠!);

try {

thissleep();

} catch (InterruptedException e) {

eprintStackTrace();

}

getChopsticks();

}

}else{//其他情况先抢右边的筷子

if(rightChopsticks(tem)){//先抢右手边的筷子

if(leftChopsticks(tem)){//如果获得了右手边的去抢左手边的筷子

eating();//如果获得了两只筷子开始吃饭

freeLeftChopsticks(tem);//吃完了释放左手边的筷子

freeRightChopsticks(tem);//释放右手边的筷子

}else{

freeRightChopsticks(tem);

Systemoutprintln(由于+thisgetName()+无法获得左手边的筷子所以他把已获得的右手的筷子也释放了!);

try {

thissleep();

} catch (InterruptedException e) {

eprintStackTrace();

}

getChopsticks();

}

}else{

Systemoutprintln(thisgetName()+暂时无法获取两只筷子准备休眠!);

try {

thissleep();

} catch (InterruptedException e) {

eprintStackTrace();

}

getChopsticks();

}

}

}

public boolean leftChopsticks(int tem){//获取左手边筷子

if(chopsticks[tem]==){

chopsticks[tem]=;

Systemoutprintln(thisgetName()+左手边筷子已获得!);

return true;

}else{

Systemoutprintln(thisgetName()+左手边筷子已被哲学家+(tem)+抢走!);

return false;

}

}

public boolean rightChopsticks(int tem){//获取右手边筷子

int i=(tem+)%;

if(chopsticks[i]==){

chopsticks[i]=;

Systemoutprintln(thisgetName()+右手边筷子已获得!);

return true;

}else{

Systemoutprintln(thisgetName()+右手边筷子已被哲学家+i+抢走!);

return false;

}

}

public void freeLeftChopsticks(int tem){//获取左手边筷子

chopsticks[tem]=;

Systemoutprintln(thisgetName()+左手边筷子已释放!);

}

public void freeRightChopsticks(int tem){//获取右手边筷子

int i=(tem+)%;

chopsticks[i]=;

Systemoutprintln(thisgetName()+右手边筷子已释放!);

}

public void eating(){//开始进餐

Systemoutprintln(*+thisgetName()+两只手都有了筷子所以开始吃饭!);

}

/**

* 主函数

*/

public static void main(String[] args) {

for(int i=; i<; i++){

new Scientist(哲学家+i)start();

}

}

}

               

上一篇:八个改善Java遗留系统的技巧

下一篇:Java中的静态代理和动态代理