移动端多线程编程高级篇-哲学家吃饭问题

1.哲学家就餐问题问题描述

 



2.源代码描述

 

public class DemoPhil {
	volatile public List<ReentrantLock> mLocks = new ArrayList<ReentrantLock>();
	List<Philosopher> mList = new ArrayList<Philosopher>();
	private Object obj = new Object();
	
	public DemoPhil() {
		for(int i = 0;i < 4;i++){
			mLocks.add(new ReentrantLock());
		}
		//四个哲学家
		mList.add(new Philosopher(2,"饺子",1));
		mList.add(new Philosopher(1,"刀削面",2));
		mList.add(new Philosopher(2,"回锅肉",3));
		mList.add(new Philosopher(2,"米饭",4));
		
		// TODO Auto-generated constructor stub
		for(int i = 0;i < 4;i++){
			final int index = i;
			Thread thread = new Thread("tName-" + i){
				@Override
				public void run() {
					super.run();
					final Philosopher philosopher = mList.get(index);
					while(true){
						if(philosopher.cnt >= philosopher.MAX_CNT){
							System.out.println("==============================================");
							break;
						}else{
							//尝试获取左边筷子
							int leftIndex = index;
							int rightIndex = index + 1;
							//右边筷子
							if(rightIndex >= mList.size()){
								rightIndex = 0;
							}
							ReentrantLock leftChopStrick = mLocks.get(leftIndex);
							ReentrantLock rightChopStrick = mLocks.get(rightIndex);
							System.out.println("哲学家"+philosopher.number+"尝试锁定筷子" + leftIndex + "," + rightIndex + "");
							if(!leftChopStrick.isLocked() && !rightChopStrick.isLocked()){
								System.out.println("哲学家"+philosopher.number+"锁定筷子" + leftIndex + "," + rightIndex + "成功...");
								leftChopStrick.lock();
								rightChopStrick.lock();
								try{
									try {
										System.out.println("哲学家" + philosopher.number + " 正在吃" + philosopher.eatSth + " 需要时间:" + (philosopher.eatTime/1000) + "秒");
										Thread.sleep(philosopher.eatTime);
										philosopher.cnt++;
									} catch (InterruptedException e) {
										e.printStackTrace();
									}
								}finally{
									leftChopStrick.unlock();
									rightChopStrick.unlock();
									synchronized (obj) {
										obj.notifyAll();
									}
								}
							}else{
								synchronized (obj) {
									try {
										System.out.println("哲学家" + philosopher.number + " 没有锁定筷子成功,等待中...");
										obj.wait();
									} catch (InterruptedException e) {
										e.printStackTrace();
									}
									System.out.println("哲学家" + philosopher.number + " 由等待筷子中被唤醒...");
								}
							}
						}
					}
					System.out.println("哲学家" + philosopher.number + "已经次完饭啦~");
				}
			};
			thread.start();
		}
	}
	
	public class Philosopher{
		public long eatTime;	//吃饭时间
		public String eatSth;	//吃饭食物
		public int number;		//哲学家编号
		public int cnt;			//吃几碗饭
		public final int MAX_CNT = 3;
		
		public Philosopher(int eatTime,String eatSth,int number){
			this.eatTime = eatTime * 1000;
			this.eatSth = eatSth;
			this.number = number;
		}
	}

	
	public static void main(String[] args) {
		new DemoPhil();
	}
}


运行结果:

哲学家1尝试锁定筷子0,1
哲学家1锁定筷子0,1成功...
哲学家1 正在吃饺子 需要时间:2秒
哲学家3尝试锁定筷子2,3
哲学家3锁定筷子2,3成功...
哲学家3 正在吃回锅肉 需要时间:2秒
哲学家4尝试锁定筷子3,0
哲学家4 没有锁定筷子成功,等待中...
哲学家2尝试锁定筷子1,2
哲学家2 没有锁定筷子成功,等待中...
哲学家2 由等待筷子中被唤醒...
哲学家2尝试锁定筷子1,2
哲学家2 没有锁定筷子成功,等待中...
哲学家4 由等待筷子中被唤醒...
哲学家4尝试锁定筷子3,0
哲学家4 没有锁定筷子成功,等待中...
哲学家1尝试锁定筷子0,1
哲学家1锁定筷子0,1成功...
哲学家1 正在吃饺子 需要时间:2秒
哲学家3尝试锁定筷子2,3
哲学家3锁定筷子2,3成功...
哲学家3 正在吃回锅肉 需要时间:2秒
哲学家4 由等待筷子中被唤醒...
哲学家4尝试锁定筷子3,0
哲学家4 没有锁定筷子成功,等待中...
哲学家2 由等待筷子中被唤醒...
哲学家2尝试锁定筷子1,2
哲学家2 没有锁定筷子成功,等待中...
哲学家2 由等待筷子中被唤醒...
哲学家2尝试锁定筷子1,2
哲学家2 没有锁定筷子成功,等待中...
哲学家1尝试锁定筷子0,1
哲学家1锁定筷子0,1成功...
哲学家1 正在吃饺子 需要时间:2秒
哲学家4 由等待筷子中被唤醒...
哲学家4尝试锁定筷子3,0
哲学家4 没有锁定筷子成功,等待中...
哲学家4 由等待筷子中被唤醒...
哲学家4尝试锁定筷子3,0
哲学家4 没有锁定筷子成功,等待中...
哲学家2 由等待筷子中被唤醒...
哲学家2尝试锁定筷子1,2
哲学家2 没有锁定筷子成功,等待中...
哲学家3尝试锁定筷子2,3
哲学家3锁定筷子2,3成功...
哲学家3 正在吃回锅肉 需要时间:2秒
==============================================
哲学家1已经次完饭啦~
哲学家2 由等待筷子中被唤醒...
哲学家2尝试锁定筷子1,2
哲学家4 由等待筷子中被唤醒...
哲学家4尝试锁定筷子3,0
哲学家2 没有锁定筷子成功,等待中...
哲学家4 没有锁定筷子成功,等待中...
==============================================
哲学家4 由等待筷子中被唤醒...
哲学家4尝试锁定筷子3,0
哲学家4锁定筷子3,0成功...
哲学家3已经次完饭啦~
哲学家4 正在吃米饭 需要时间:2秒
哲学家2 由等待筷子中被唤醒...
哲学家2尝试锁定筷子1,2
哲学家2锁定筷子1,2成功...
哲学家2 正在吃刀削面 需要时间:1秒
哲学家2尝试锁定筷子1,2
哲学家2锁定筷子1,2成功...
哲学家2 正在吃刀削面 需要时间:1秒
哲学家2尝试锁定筷子1,2
哲学家2锁定筷子1,2成功...
哲学家2 正在吃刀削面 需要时间:1秒
哲学家4尝试锁定筷子3,0
哲学家4锁定筷子3,0成功...
哲学家4 正在吃米饭 需要时间:2秒
==============================================
哲学家2已经次完饭啦~
哲学家4尝试锁定筷子3,0
哲学家4锁定筷子3,0成功...
哲学家4 正在吃米饭 需要时间:2秒
==============================================
哲学家4已经次完饭啦~


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值