0
    private static int millis_per_tick = 1;
    public void run() 
    {   
      // While not stop do
      while(true) 
      {
        Thread t = Thread.currentThread();
        long startTime, timeTaken;          
        startTime = System.currentTimeMillis();
        act();
        timeTaken = System.currentTimeMillis() - startTime;
        if(timeTaken < millis_per_tick )
        {
            try 
            {
                Thread.sleep(millis_per_tick-timeTaken );
            }

            catch(InterruptedException ex)
            {}

        }

thread.sleep メソッドは double 値を受け入れず、float と integer のみを受け入れます。しかし、1未満の値が必要です。

宇宙で

public void act() 
{
    ListIterator<Body> iterator = bodies.listIterator();
    while (iterator.hasNext())
    {
        Body body = iterator.next();
        body.wirkenKraefte();
        body.move();
    }
    spaceGUI.repaint();
4

3 に答える 3

1

API のThread.sleep(long,int)メソッドを確認してください。

指定されたミリ秒数と指定されたナノ秒数の間、現在実行中のスレッドをスリープ (実行を停止) させます。

于 2011-10-01T09:43:21.130 に答える
0

これは不可能です。1 ミリ秒は 1 ミリ秒 (15.6 ミリ秒) よりもさらに大きく、これは保証されません。

Thread.Sleep の解像度を上げることはできますか?

于 2011-10-01T09:43:39.823 に答える
0

を使用して 1 ミリ秒未満でスリープすることはできませんThread.sleep(long)。多くのプラットフォームでは、システム クロックの粒度によっては、1 ミリ秒スリープしても実際にはより長く (たとえば 15 ミリ秒) スリープすることがわかります。

言い換えれば、基本的にあなたがやろうとしていることをすることはできません.Thread.sleep(long)ミリ秒未満の精度の時間を取得しようとすることは、そもそも面倒です. System.nanoTime()代わりに使用してみることができます。これは経過時間にのみ適しています (この場合は問題ありません) 。また、スリープする代わりに、スピンロックを適切な時間まで待機することを検討することもできます。

ほとんどの場合、1 秒あたり 1000 回の呼び出しの固定レートで何かを実行しようとすることさえ悪い考えです...ここでのユースケースは何ですか? より良いアプローチがあるかもしれません。

編集: あることに気付きました。これを使用して、(たとえば) 0 ミリ秒と 100,000 ナノ秒スリープすること Thread.sleep(millis, nanos)できますただし、ほとんどのプラットフォームでは、これは実際には希望どおりにならないことに注意してください。特定のユースケースで試すことができますが、個人的にはあまり期待できません.

于 2011-10-01T09:43:47.323 に答える