快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

问题:Thread .Sleep(500)后你的线程睡了多久?


我们在J2ME中继续Canvas类的时候一般会再实现Runnable接口,实现多线程的效果个人认为实际上这边的线程不过是起到一个定时器的作用,完全可以用一个Timer或者用一个Inner class来实现这个的功能,在这里不对这个做过多的讨论。

我们的run()这个函数一般是实现这样的功能,定时的处理游戏逻辑gameLogic()和重画屏幕paint()。注重这里的定时是本文的重点,假如执行游戏逻辑和重画屏幕的间隔时间不为固定的话。一定破坏游戏性和游戏画面的真实性。

好了,我们看看一般的处理方式()

public void run() {

   while (true) {

     gameLogic();//处理游戏逻辑

     repaint();//调用paint()重画屏幕

     Thread.sleep(500);//线程sleep0.5秒

   }

}

看上去好象是每次的间隔就是0.5秒。不过有没有想过假如一个复杂逻辑的游戏gameLogic(),和paint()实际上也是需要不少时间来处理的,而且对于一个复杂逻辑的游戏来说每次处理的时间长度都不一样,可能第一次gameLogic()+paint()的时间是0.1秒下一次又有可能是0.01秒。这样不就造成了间隔时间的不固定吗。所以我们必须把gameLogic(),和paint()的运算时间计算进去,就象下面那样。

    public void run() {

        time0 = System.currentTimeMillis();

        while (true) {

            time1 = System.currentTimeMillis();

            timePassed = time1 - time0;

            time0 = time1;

            gameLogic();//处理游戏逻辑

            repaint();

            time1 = System.currentTimeMillis();

            if (time1 - time0 < RUN_RATE) {

                try {

                    Thread.sleep(RUN_RATE - (time1 - time0));

                }

                catch (InterruptedException e) {

                }

            }

        }

    }




返回类别: 教程
上一教程: OOP和RDBMS不匹配,谁向谁妥协,还是找个和稀泥的?
下一教程: java链接数据库的工具类

您可以阅读与"问题:Thread .Sleep(500)后你的线程睡了多久?"相关的教程:
· Java多线程中的两个问题
· Java开发中的线程安全选择与Swing[Z]
· SERVLET及JSP中的多线程同步问题
· Java 理论与实践:嗨,我的线程到哪里去了?
· java学习日记(线程)
    微笑服务 优质保证 索取样品