线程例题,哲学家用餐

简介:

例题,哲学家用餐:

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

示意图:

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月前
|
人工智能 算法 BI
AcWing 505. 火柴排队(每日一题)
AcWing 505. 火柴排队(每日一题)
|
10月前
|
算法 C++
【洛谷 P1223】排队接水(贪心算法+结构体排序)
该问题要求安排$n$个人的排队顺序以最小化平均等待时间。每个人接水需时$T_i$,解决方案是让接水时间短的人优先。给定$n\leq1000$和$t_i\leq10^6$,代码示例使用C++实现,通过排序使时间从小到大排列,然后计算平均等待时间。样例输入为10个人的时间数组,输出为优化后的排队顺序及平均等待时间(291.90)。
89 0
|
11月前
|
存储 Java
面试官:你真的搞清位运算了么?
面试官:你真的搞清位运算了么?
75 0
|
机器学习/深度学习
蓝桥杯:栈 和 例题 :小邋遢的衣橱
蓝桥杯:栈 和 例题 :小邋遢的衣橱
195 0
|
8月前
|
存储 算法
读《趣学算法》:重开算法之门,神奇的兔子数列(斐波那契数列)
本文通过《趣学算法》中的斐波那契数列问题,探讨了算法的递归实现、时间复杂度分析,并展示了如何通过迭代和优化存储空间来改进算法,最终将时间复杂度从指数级降低到线性级,并将空间复杂度从线性级降低到常数级。
148 0
读《趣学算法》:重开算法之门,神奇的兔子数列(斐波那契数列)
|
11月前
|
C语言
Leetcode每日一题——“用栈实现队列”
Leetcode每日一题——“用栈实现队列”
|
C语言
[链表OJ题 8] 用栈实现队列,没想到你小子的基础这么好,这么快就做对了
[链表OJ题 8] 用栈实现队列,没想到你小子的基础这么好,这么快就做对了
|
C++
Leetcode 每日一题 1911. 最大子序列交替和 c++
Leetcode 每日一题 1911. 最大子序列交替和 c++
102 0
|
C语言
C语言:带你轻松干掉 腾讯笔试大题 带环链表
C语言:带你轻松干掉 腾讯笔试大题 带环链表
94 0
|
算法 Python
转:最大公约数算法很无聊吗?一个轻松方法(辗转相除法)3行代码搞定
最大公约数算法不是很无聊,计算最大公约数是数学中一个重要的概念,可以用于判断两个数是否互质、求分数的约分等,在很多领域都有广泛的应用。辗转相除法3行代码搞定。
99 0