哲学家进餐问题与生产者与消费者问题(java实现)
来源:互联网 发布:德国航空发动机知乎 编辑:程序博客网 时间:2024/05/21 06:45
public class Test2 {
/**
* 哲学家进餐问题
*/
public static void main(String[] args) {
new Thread(new philosopher(0)).start();
new Thread(new philosopher(1)).start();
new Thread(new philosopher(2)).start();
new Thread(new philosopher(3)).start();
new Thread(new philosopher(4)).start();
}
}
class Signs2{ //信号量
final static int philosophers = 5; //哲学家的人数
final static int THINKING = 0;//思考
final static int EATING = 1;//进餐
static int[] status = new int[philosophers];//五个哲学家五种状态 默认THINKING
static Semaphore[] s = null;//记录哲学家是否可以进餐,不进餐则阻塞
static Semaphore mutex = new Semaphore(1);// 互斥信号量
static{
s = new Semaphore[philosophers];
for(int i = 0;i<philosophers;i++){
s[i] = new Semaphore(0);//初始化
}
}
}
class philosopher implements Runnable{
private int pid;//当前哲学家id
private int lid;//左边哲学家id
private int rid;//右边哲学家id
public philosopher(int id) {//构造函数
super();
this.pid = id;
this.lid = (id+4)%5;
this.rid = (id+1)%5;
}
public void test(int pid){
// 如果当前哲学家在思考,左右两边的哲学家没有进食,则他可以进食
if(Signs2.status[pid]==Signs2.THINKING&&Signs2.status[lid]!=Signs2.EATING&&Signs2.status[rid]!=Signs2.EATING){
Signs2.status[pid]=Signs2.EATING;//可以吃 其他两个则不能进食
Signs2.s[pid].release();// 吃完释放1个许可
}
}
@Override
public void run() {
try{
while(true){
//尝试进餐
Signs2.mutex.acquire();
test(pid);
Signs2.mutex.release();
//判断当前哲学家进餐的状况,不能进餐 则 阻塞
Signs2.s[pid].acquire();
System.out.println("#"+pid+"号哲学家正在进餐。。。。。");
//放下刀叉,唤醒左右哲学家,,让他们尝试进餐
Signs2.mutex.acquire();
Signs2.status[pid] = Signs2.THINKING;//开始思考
test(lid);//让左手边的哲学家 尝试进餐, 如果可以 则释放他的许可
test(rid);//同上
Signs2.mutex.release();//释放信号量
}
}catch(Exception e){
e.printStackTrace();
}
}
}
import java.util.Random;
import java.util.concurrent.Semaphore;
/**
* 生产者与消费者的问题
*
* */
class Signs {
static Semaphore empty = new Semaphore(10); // 信号量:记录仓库空的位置
static Semaphore full = new Semaphore(0); // 信号量:记录仓库满的位置
static Semaphore mutex = new Semaphore(1); // 临界区互斥访问信号量, 相当于互斥锁。
}
//生产一个产品
class Producer implements Runnable {
Random r = new Random(1000);
public void run() {
try {
while (true) {
Signs.empty.acquire(); // 递减仓库空信号量
Signs.mutex.acquire(); // 进入临界区
Test.COUNT++;
System.out.println("生产一个产品放入仓库,剩余:"+Test.COUNT);
Signs.mutex.release(); // 离开临界区
Signs.full.release(); // 递增仓库满信号量
Thread.currentThread().sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//消费一个产品
class Consumer implements Runnable {
public void run() {
try {
while (true) {
Signs.full.acquire(); // 递减仓库满信号量
Signs.mutex.acquire();
Test.COUNT--;
System.out.println("C1拿出一个产品消费,剩余:"+Test.COUNT);
Signs.mutex.release();
Signs.empty.release(); // 递增仓库空信号量
Thread.currentThread().sleep((1000));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer2 implements Runnable {
public void run() {
try {
while (true) {
Signs.full.acquire(); // 递减仓库满信号量
Signs.mutex.acquire();
Test.COUNT--;
System.out.println("C2拿出一个产品消费,剩余:"+Test.COUNT);
Signs.mutex.release();
Signs.empty.release(); // 递增仓库空信号量
Thread.currentThread().sleep((500));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Test {
public static int COUNT=0;//产品数目
public static void main(String[] args) {
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
new Thread(new Consumer2()).start();
}
}
- 哲学家进餐问题与生产者与消费者问题(java实现)
- 哲学家进餐问题的算法与实现
- Java实现哲学家进餐问题
- 尝试解决哲学家进餐问题(Java实现)
- java 多线程实现 哲学家进餐问题
- 生产者与消费者问题Java实现
- 生产者消费者问题理解与Java实现
- 生产者消费者问题理解与Java实现
- java 生产者与消费者问题实现
- 生产者消费者问题理解与Java实现
- 生产者消费者问题理解与Java实现
- 生产者与消费者问题【java实现】
- 生产者与消费者问题,java实现
- java实现生产者与消费者问题
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
- Java 多线程-哲学家进餐问题
- java生产者与消费者问题
- java 生产者 与 消费者 问题
- 中间件学习之初感(20120226)
- 给未来儿子的信 ,笑死我了
- 关于自定义组件被点击或选中时背景的方法
- [分享]SAP概念--集团-公司-公司代码
- v880+ 二十种方法,教您省电!安卓手机
- 哲学家进餐问题与生产者与消费者问题(java实现)
- indexOf()练习,查找某个字符出现的次数
- perl uc,lc,ucfirst,lcfirst的用法
- javascript检测密码弱强
- ie6.0中关于动态改变html中select标签中option的处理方法
- Extjs TextField的maxlength不起作用
- 图解SQL Server 2008安装和配置过程
- jsp之get和set区别与联系!
- SYSTEM.GC FINALIZE小小的注释