线程例题,哲学家用餐

简介:

例题,哲学家用餐:

在一张餐桌上坐着五个哲学家,但是却只有五根筷子,每个哲学家只有一根筷子,所以当一个哲学家要夹菜的时候需要用他旁边那个哲学家的筷子,被拿走筷子的哲学家则只能等待那个哲学家吃完放下筷子他才能夹菜。

示意图:

330d44d5bcab64b46ad5cfec6c0c019c.png



设计思路:

首先编写一个筷子类,每根筷子都是一个对象,这个类里有拿起、放下两个方法;当一个哲学家线程来调用拿起方法时,下一个哲学家线程就要进入等待状态,然后这个哲学家线程调用放下方法后,就激活那个等待中的哲学家线程,以此循环,轮流使用筷子。

   代码示例:

742685982bac5ef965f73640d835262e.png




接着设计哲学家类,这个类继承Thread类,每个哲学家都是一个线程对象。这类有三个属性,用于存放构造器的参数,这个类的构造器要求传递三个参数,分别是哲学家的名字(name)、右边的筷子(right)、左边的筷子(left)。左右筷子的类型都是筷子类型,也就是需要传递两个筷子对象。然后遍写拿起和放下方法,这个两个方法里分别调用着筷子类的拿起、放下方法。在run方法里使用死循环调用拿起和放下方法,并且使用sleep设置一个间隔时间。

    代码示例:

4f3157fdcb89b8c51b570ce5190b8f1c.png

1c3df3940fd46ff1d1b4d80c8db864f8.png



最后编写测试类,测试类里构建五个筷子对象。然后构建五个哲学家对象,分别传递相应的参数。接着将哲学家对象使用start方法启动。

代码示例:

0fd90b7bb5a88c451b3d37f465285cfb.png


运行结果:

98e64e74bc678baa67bd54bfeec8a84f.png



将这个例题升级为图形化版:

  先构建出界面,将JPanel的背景颜色都设置为白色:

60c737c6b5ce9ce5fdf6291bfe5c68ba.png





筷子类不需要更改,哲学家类则需要添一个JPanel类型的属性用来存放构造器的参数,构造器加多一个JPanel类型的参数。然后在拿起方法里设置JPanel的背景颜色为红色。在放下方法里则设置回白色。

  代码示例:

6525dc1e04b162e4fc5992df30d859b9.png



测试类添加一个线程内部类来调用窗口类的main方法。

代码示例:

b5f6575fd39b6daf64c74bb6716868ef.png


运行结果:

c958304f4db34749df768c2bdab03a46.png





定时器类:

Timer定时器类是与线程相关的一个工具类,顾名思义这个类能够到了设置的时间就运行一些代码,这些代码写在run方法里。使用这个类的时候需要继承TimerTask类,使用Timer对象调用schedule方法实现定时。

  代码示例:

413af11ea29124b1366cf4d9f5181aec.png




本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976653,如需转载请自行联系原作者

相关文章
|
6月前
|
API 调度 C语言
C++实现进程调度模拟程序——哲学家进餐问题
C++实现进程调度模拟程序——哲学家进餐问题
128 0
|
3月前
|
算法 安全 Java
银行家算法代码
银行家算法代码
22 0
|
7月前
|
C++
Leetcode 每日一题 1911. 最大子序列交替和 c++
Leetcode 每日一题 1911. 最大子序列交替和 c++
56 0
|
8月前
|
算法
LeetCode-587 安装栅栏及三种凸包算法的学习
LeetCode-587 安装栅栏及三种凸包算法的学习
|
9月前
|
算法 安全
【软考学习11】死锁问题和银行家算法
【软考学习11】死锁问题和银行家算法
158 0
|
10月前
哲学家进餐问题
哲学家进餐问题
71 0
|
10月前
|
机器学习/深度学习 C语言 决策智能
【每日一道智力题】之 轮流取石子(尼姆博弈的详解)
【每日一道智力题】之 轮流取石子(尼姆博弈的详解)
155 0
|
10月前
|
C语言
【每日一道智力题】之 轮流取石子(简单的尼姆博弈)
【每日一道智力题】之 轮流取石子(简单的尼姆博弈)
119 0
|
11月前
|
算法 安全
银行家算法
银行家算法
|
11月前
leetcode线程题1117——H2O 生成(两个氢原子结合一个氧原子)
leetcode线程题1117——H2O 生成(两个氢原子结合一个氧原子)