`
Breese
  • 浏览: 61635 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

吃饭的哲学家(线程死锁例子)

 
阅读更多

package tianya.cn.philopherfood;

 

public class Chopstick {

private static int count = 0;

private int number = count++;

 

public String toString(){

return "Chopstick" + number;

}

}

===========================================

package tianya.cn.philopherfood;

 

import java.util.Random;

 

public class Philosopher extends Thread {

private static Random random = new Random();

private static int count = 0;

 

private int number = count++;

 

private Chopstick leftChopstick;

private Chopstick rightChopstick;

 

public static int ponder = 0;//package access,time of philosopher thinking

 

public Philosopher(Chopstick left, Chopstick right){

leftChopstick = left;

rightChopstick = right;

start();

}

 

public void thinking(){

System.out.println();

 

if(ponder > 0){

 

try {

sleep(random.nextInt(ponder));

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

 

public void eat(){

synchronized (leftChopstick) {

System.out.println(this + " has " + this.leftChopstick + " waitting for " + this.rightChopstick);

}

 

synchronized (rightChopstick) {

System.out.println(this + "eating");

}

}

 

 

public String toString(){

return "Philospher" + number;

}

 

public void run(){

while(true){

thinking();

eat();

}

}

}

 

==========================================================

package tianya.cn.main;

 

import java.util.Timer;

import java.util.TimerTask;

 

import tianya.cn.philopherfood.Chopstick;

import tianya.cn.philopherfood.Philosopher;

 

public class DiningPhilosophers {

 

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

 

if( args.length < 3){

System.err.println("输入参数错误!。。。。。。。");

System.exit(0);

}

 

Philosopher[] philosopher = new Philosopher[ Integer.parseInt(args[0]) ];

 

Philosopher.ponder = Integer.parseInt( args[1] );

 

Chopstick

left = new Chopstick(),

right = new Chopstick(),

first = left;

 

int i = 0;

if(i < philosopher.length - 1){

philosopher[i++] =  new Philosopher(left, right);

left = right;

right =  new Chopstick();

}

 

if(args[2].equals("deadlock")){

 

philosopher[i] = new Philosopher(left, first);

}else{

//swaping values prevents deadblock

philosopher[i] = new Philosopher(first, left);

}

 

//

if(args.length > 3){

int delay =  Integer.parseInt( args[3] );

new Timer().schedule(new TimerTask() {

 

@Override

public void run() {

// TODO Auto-generated method stub

System.out.println("OVER!!!");

System.exit(0);

}

}, delay);

}

 

}

 

}

 

分享到:
评论

相关推荐

    有关于哲学家进餐死锁问题及预防的课程设计报告

    哲学家进餐问题的课程设计报告,包括课程设计背景,程序流图,源代码,分析,注解,以及课程设计总结。相当完整

    哲学家进餐问题死锁的造成.cpp

    死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请求资源而...先写一个会造成死锁的哲学家问题。当所有哲学家同时决定进餐,拿起左边筷子时候,就发生了死锁。

    哲学家就餐问题与死锁问题

    操作系统死锁问题 C语言实现 有详细代码 都能实现

    哲学家就餐问题与死锁

    死锁是进程并发执行过程中可能出现的现象,哲学家就餐问题是描述死锁的经典例子。假设有几位哲学家围坐在一张餐桌旁,桌上有吃不尽的食品,每两位哲学家之间摆放着一根筷子,筷子的个数与哲学家的数量相等,每一位...

    操作系统 实验报告(含代码) 死锁和饥饿2 哲学家就餐问题

    哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是: 每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,...

    哲学家多线程

    哲学家多线程 java

    哲学家就餐(死锁与非死锁解法)(图形界面)

    哲学家就餐问题图形界面(代码教程见博客:...(2)有图形界面直观显示哲学家取筷子,吃饭,放筷子,思考等状态。(3)为增强结果的随机性,各个状态之间的维持时间采用随机时间,例如100ms-500ms 之间。

    多进程/线程编程:哲学家问题

    多进程/线程编程:哲学家问题。  设置进程/线程,描述哲学家 ;  随机启动哲学家 ;... 编写正确的哲学家程序,设法延迟线程的执行,使之出现死锁;  编写正确的哲学家程序,保证不出现死锁;

    计算机系统实验报告(哲学家就餐死锁).pdf

    计算机系统实验报告(哲学家就餐死锁).pdf

    哲学家就餐:Java多线程实例图形版

    哲学家就餐:Java多线程实例图形版 哲学家就餐是一个经典的Java多线程编程的实例,这是图形版。涉及到线程同步与互斥,临界区访问问题以及避免死锁的方法。    哲学家就餐:有五个哲学家绕着圆桌坐,每个哲学家...

    哲学家就餐问题是一个经典的同步问题,用多线程编程实现哲学家就餐问题

    哲学家就餐问题是一个经典的同步问题,用多线程编程实现哲学家就餐问题

    哲学家吃饭问题(线程的同步)

    有五个哲学家围成一圈,每人左右各有一只筷子,每人只能使用自己左右的筷子,当拿起左右筷子后就可以吃饭,否则就等待。

    java解哲学家就餐问题

    哲学家进餐问题是一个多线程运用的经典例子,涉及到线程同步/互斥,临界区访问问题以及一个避免死锁的解决方法。 有五个哲学家绕着圆桌坐,每个哲学家面前有一盘面,两人之间有一支筷子,这样每个哲学家左右各有一...

    哲学家吃饭问题(vc代码)

    哲学家吃饭问题(vc代码) 哲学家吃饭问题(vc代码) 哲学家吃饭问题(vc代码) 哲学家吃饭问题(vc代码) 哲学家吃饭问题(vc代码)

    多线程解决哲学家吃饭问题源代码

    一个简单的cpp文件,一种简单的实现方法,初学者可用于参考

    哲学家进餐例子

    哲学家进餐的一个小程序,5个哲学家围坐在一张圆桌周围,每个哲学家面前有一碟...哲学家包含三种状态:吃饭、思考和挨饿。当一个哲学家觉得饿时,他才试图分两次去取他左边和右边的筷子就餐,吃完以后放下筷子继续思。

    哲学家吃饭问题C++编程实现

    哲学家吃饭问题 c++编程 操作系统 实例

    哲学家进餐.c

    哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有...

    哲学家.zip使用Linux线程信号量实现哲学家问题

    使用Linux线程信号量实现哲学家问题,只用信号量和互斥量。问题描述:由Dijkstra提出并解决的哲学家进餐问题(The Dinning Philosophers Problem)是典型的同步问题。该问题是描述有五个哲学家共用一张圆桌,分别坐在...

    哲学家吃饭问题

    哲学家思考后,过一定的时间就会饥饿,饥饿之后就想吃饭,吃饭后再思考。房间里有一张圆桌,桌子周围放有6把椅子,分别属于6位哲学家,每两位哲学家之间有1支筷子,哲学家进食时必须同时使用左右两支筷子。

Global site tag (gtag.js) - Google Analytics