Shimeji开源桌宠代码学习(3)

来源:互联网 发布:淘宝图片实拍保护网址 编辑:程序博客网 时间:2024/05/21 07:31
之前的文章里,我们讨论了在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都结束后才会结束,这个时候使用守护线程就非常合理了。

1 0