2010-12-12 59 views
3

定時器Java代碼不起作用定時器代碼不起作用

public interface IncDec 
{ 
void increment(); 
void decrement(); 
} 
public class MyIncDec implements IncDec 
{ 
private int x; 
public MyIncDec(int x) { 
    this.x = x; 
} 
public void increment() { 
    this.x++; 
} 
public void decrement() { 
    this.x--; 
} 
} 

1部分:實施其可以被用於測量多長時間的增量和減量方法的每次調用需要(在 毫秒)的一類和打印出這些信息。該類應該或多或少透明地適合IncDec接口的現有客戶端。

我的解決方案:

public class Test{ 
public static void main(String[] args){ 
MyIncDec mid = new MyIncDec(4); 
long l1; 
long l2; 

l1 = Calendar.getInstance().getTimeInMillis(); 
mid.increment(); 
l2 = Calendar.getInstance().getTimeInMillis(); 
System.out.println(l2-l1); 
} 
} 

我的解決方案給我的時間差異爲0。當我打電話「增量」 n之後才顯示長期價值,它們是相同的。爲什麼這樣?

假設我在應用程序中的許多地方需要類似的東西(方法調用的時機)。一個想法是爲所有不同的方法編寫一個單獨的計時器類。有沒有人有另一個優化的想法,讓時間更方便?

+2

爲什麼你期望你的方法調用需要一整毫秒。 'System.nanoTime'更精確,但不是那麼精確。 – 2010-12-12 11:34:55

+0

+1:應該問一個作業問題的一個很好的例子! :) – 2010-12-12 11:41:02

+2

你直到現在還沒有接受任何問題的答案。你是新來的,所以也許你不知道這是什麼意思。常見問題解答表示:當您確定哪個答案對您最有幫助時,請通過單擊答案左側的複選框大綱將其標記爲已接受的答案。這讓其他人知道你已經收到了你的問題的一個很好的答案。這樣做很有幫助,因爲它向其他人表明您從社區中獲得價值。 (如果你不這樣做,人們會經常禮貌地要求你回去接受更多問題的答案!) – oezi 2010-12-15 08:34:33

回答

1

首先,您的時差爲0,因爲它可能運行時間少於1毫秒。嘗試在您的increment方法中添加Thread.sleep(50)以查看是否有更改。

public void increment() { 
    try { Thread.sleep(50); } catch (InterruptedException e) { } 
    this.x++; 
} 

其次,你的功課,大概要你使用IncDec接口在類計算你的時間。所以考慮到這一點。不要學習接口是什麼,它們用於什麼,更重要的是,它們如何使用

祝你好運!

-1
  1. 我相信你的代碼有效。你必須要感謝現代計算機:它們非常快。如果您希望看到差異寫入循環0..1000000,而不是單個呼叫mid.increment()。或者以毫微秒爲單位的測量時間。
  2. 如果這不是一個練習,但真正的任務使用java分析器。有很多免費和商業的配置文件。該工具將爲您提供最佳信息。
1

我覺得你的功課是在暗示你使用的Proxy Pattern

我不會給你完整的解決方案,但這裏有一個提示:

public class MyIncDecProxy implements IncDec{ 

    MyIncDec incDec; 

    public MyIncDecProxy(int x){ 
     //Initialise incDec 
    } 

    public void increment() { 
     // Wrap the method of incDec implementing your timer 
    } 

    public void decrement() { 
     //ditto 
    } 

} 

你可以這樣用MyIncDecProxy類而不是MyIncDec