前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程例题,哲学家用餐

线程例题,哲学家用餐

作者头像
端碗吹水
发布2020-09-23 10:36:27
5900
发布2020-09-23 10:36:27
举报
文章被收录于专栏:程序猿的大杂烩

例题,哲学家用餐:

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

示意图:

330d44d5bcab64b46ad5cfec6c0c019c.png
330d44d5bcab64b46ad5cfec6c0c019c.png

设计思路:

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

   代码示例:

742685982bac5ef965f73640d835262e.png
742685982bac5ef965f73640d835262e.png

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

    代码示例:

4f3157fdcb89b8c51b570ce5190b8f1c.png
4f3157fdcb89b8c51b570ce5190b8f1c.png
1c3df3940fd46ff1d1b4d80c8db864f8.png
1c3df3940fd46ff1d1b4d80c8db864f8.png

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

代码示例:

0fd90b7bb5a88c451b3d37f465285cfb.png
0fd90b7bb5a88c451b3d37f465285cfb.png

运行结果:

98e64e74bc678baa67bd54bfeec8a84f.png
98e64e74bc678baa67bd54bfeec8a84f.png

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

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

60c737c6b5ce9ce5fdf6291bfe5c68ba.png
60c737c6b5ce9ce5fdf6291bfe5c68ba.png

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

  代码示例:

6525dc1e04b162e4fc5992df30d859b9.png
6525dc1e04b162e4fc5992df30d859b9.png

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

代码示例:

b5f6575fd39b6daf64c74bb6716868ef.png
b5f6575fd39b6daf64c74bb6716868ef.png

运行结果:

c958304f4db34749df768c2bdab03a46.png
c958304f4db34749df768c2bdab03a46.png

定时器类:

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

  代码示例:

413af11ea29124b1366cf4d9f5181aec.png
413af11ea29124b1366cf4d9f5181aec.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/10/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档