Shimeji开源桌宠代码学习(3)
之前的文章里,我们讨论了在Main::run()中调用的Main::loadConfiguration()方法,
public void run() {// 設定を読み込むloadConfiguration();// トレイアイコンを作成するcreateTrayIcon();// しめじを一匹作成するcreateMascot();getManager().start();}
这次我们先来讲getManager.().start(),这里的getManager()方法会返回一个Manger类的实例,首先看Manager的constructor
public Manager() {// これは Windows 上で動く Java のバグを修正するための処置// 短い長さの Thread.sleep を頻繁に呼ぶと Windows の時計が狂う// 長い Thread.sleep を呼んでいるとこの問題を回避できる.new Thread() {{this.setDaemon(true);this.start();}@Overridepublic void run() {while (true) {try {Thread.sleep(Integer.MAX_VALUE);} catch (final InterruptedException ex) {}}}};}
这里将Manager设为一个守护进程,然后我们再看Manager::start()方法,
/*** スレッドを開始する.*/public void start() {if ( thread!=null && thread.isAlive() ) {// もうスレッドが動いているreturn;}thread = new Thread() {@Overridepublic void run() {// 前回の時間long prev = System.nanoTime() / 1000000;try {for (;;) {for (;;) {// 現在の時間// TICK_INTERVAL 経つまでループ.final long cur = System.nanoTime() / 1000000;if (cur - prev >= TICK_INTERVAL) {if (cur > prev + TICK_INTERVAL * 2) {prev = cur;} else {prev += TICK_INTERVAL;}break;}Thread.sleep(1, 0);}// マスコットたちを動かす.tick();}} catch (final InterruptedException e) {Thread.currentThread().interrupt();}}};thread.setDaemon(false);thread.start();}
主要设置了线程的休眠时间和Manager实例去调用tick()方法刷新的规则,也就是说,通过将Manager设置为 守护线程,在项目结束前才会结束,同时管理每一个shimeji的线程,这种设计思路对于整个进程的管理有很大的启发。
因为我们希望只要程序在运行,就需要一个manager来处理创建一个新的shimeji,等响应应用监听到的事件的并且当所有shimeji都结束后才会结束,这个时候使用守护线程就非常合理了。
Shimeji开源桌宠代码学习(3)相关推荐
- Shimeji开源桌宠代码学习(2)
在 Shimeji开源桌宠代码学习(1)中描述了整个配置文件加载的过程,其中很多地方使用了Builder这一概念,首先我们先来看看这些Builder都有什么特征,我认为我们从AnimationBuil ...
- Shimeji开源桌宠代码学习(1)
Shimeji在日语中本意为"蘑菇". 我们这里的Shimeji是种可以在电脑桌面上四处走动,玩耍,分裂以及卖萌捣乱的桌面程序. 这种桌面程序具有高度可配置的特点.其运行方式是依靠 ...
- 《开源思索集》一如何更有效地学习开源项目的代码?
本节书摘来异步社区<开源思索集>一书中的第2章,第2.1节,作者: 庄表伟 责编: 杨海玲, 更多章节内容可以访问云栖社区"异步社区"公众号查看. 如何更有效地学习开源 ...
- 如何有效地学习开源项目的代码?
对于计算机专业的同学来说,网络上丰富的开源代码是一笔极为宝贵的财富.通过对开源代码的学习与钻研,大家能从中学到很多书本上.课堂上学习不到的实践知识.如何学习开源代码以及如何学好开源代码成为了大家经常关 ...
- android+饭否+开源,fanfou(饭否) android客户端 代码学习一
fanfou(饭否) android客户端 代码学习1 LoginActivity.class类 Intent intent = getIntent().getParcelableExtra(Inte ...
- python写桌宠_【Unity/开源】八重樱桌宠(三):Python自动更新、修复描边
接下来就到了喜闻乐见的PY环节: defget_html(url):try:headers = { "Host": "github.com","Use ...
- 如何从零开始制作智能桌宠?
作者 | 李秋键 责编 | maozz 出品 | CSDN(ID:CSDNnews) 引言:是否还记得曾经风靡全国的QQ宠物呢,那个又调皮又可爱的QQ企鹅,偶尔还会生病撒娇,需要培养的虚拟宠物,你是否 ...
- python桌面宠物_如何从零开始制作智能桌宠?
作者 | 李秋键 责编 | maozz 引言:是否还记得曾经风靡全国的QQ宠物呢,那个又调皮又可爱的QQ企鹅,偶尔还会生病撒娇,需要培养的虚拟宠物,你是否还记得它的样子呢.它是腾讯公司推出的第一款QQ ...
- 清华「计图」、旷视「天元」纷纷重磅开源,国产深度学习框架迎来高光时刻...
来源:CSDN 本文约3141字,建议阅读7分钟. 本文介绍清华开源的深度学习框架 Jittor(计图) 引起了广泛关注,支撑旷视诸多业务和战绩的深度学习框架 MegEngine(天元) 也将在近日开 ...
最新文章
- 【 MATLAB 】DFT性质讨论(一)线性、循环反转、共轭与实序列的对称性
- CodeSmith基础(七)
- kali64位下载怎么是AMD_AMD平台虚拟机安装macOS Sierra方法
- hibernate 联合主键 merge
- ajax(检测用户名,添加数据)
- 休眠事实:等于和HashCode
- 设计模式(三):单例模式
- 起泡排序算法_气泡排序算法
- spring boot设置http https端口
- 如何将通讯录批量转换为vcf格式导入手机,苹果手机如何批量删除通讯录?
- Python爬虫 批量下载美桌网高清美女壁纸
- c语言中结构体定义中的“冒号”
- SQLITE3 使用总结
- 最新杭州公交线路调整,文二路文三路段
- 2020全球搜索引擎市场份额排行榜
- 腾讯产品策划运营类职位笔试题和参考答案
- 猿创征文 |【算法入门必刷】数据结构-栈(三)
- OpenJudge 7624 山区建小学
- mapengpeng1999@163.com 数据库的设计
- Telnet操作步骤
热门文章
- 软件架构师考试的真实感受
- SVN报错fail to run the WC Db work queue associated with,清理失败,乱码的解决方式
- 股价横盘一年,抄底百度的最佳时机到了?
- 云表平台中设置明细行单元格样式
- Python | 马上又双叒叕七夕了,男同胞们都准备好分手了吗
- python 通过 matplotlib 绘制矢量图
- 〖Linux〗iptables端口转发(11.11.136.80:5552 == 10.10.136.1:8055/11.11.136.1:8055)
- 家庭收支管理系统(java)
- 拉卡拉支付提供一站式支付解决方案
- 美团二面:为什么 Redis 会有哨兵?