問題:Thread .Sleep(500)後你的線程睡了多久?

來源:互聯網
上載者:User
問題
我們在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) {

                }

            }

        }

    }


相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。