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

这是不可能的。1ms 甚至超过 1ms (15.6ms),这不是保证的。

->我可以提高 Thread.Sleep 的分辨率吗?

于 2011-10-01T09:43:39.823 回答
0

您不能使用少于一毫秒的睡眠Thread.sleep(long)- 在许多平台上,您会发现即使睡眠一毫秒实际上也会睡眠更长的时间(例如 15 毫秒),具体取决于系统时钟的粒度。

换句话说,你基本上不能做你想做的事情Thread.sleep(long)——而且试图获得亚毫秒精度的时间首先是很麻烦的。您可以尝试使用System.nanoTime(),它适用于经过的时间(在这种情况下很好) - 您可能需要考虑使用自旋锁等到正确的时间,而不是休眠。

在大多数情况下,即使尝试以每秒 1000 次调用的固定速率执行某些操作也是一个坏主意……这里的用例是什么?可能有更好的方法。

编辑:我刚刚注意到有- Thread.sleep(millis, nanos)您可以尝试使用它并休眠(例如)0毫秒和100,000纳秒。您应该知道,在大多数平台上,这实际上并不能满足您的需求。您可以针对您的特定用例尝试它,但我个人不会抱太大希望。

于 2011-10-01T09:43:47.323 回答