Отставание от метода run () сильно - PullRequest
0 голосов
/ 01 октября 2011
    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 не принимает двойные значения только с плавающей точкой и целым числом.Но мне нужно значение меньше 1.

В космосе

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

Ответы [ 3 ]

1 голос
/ 01 октября 2011

Извлеките метод Thread.sleep (long, int) в API.

Заставляет текущий выполняющийся поток спать (прекращать выполнение) для указанного числамиллисекунды плюс указанное количество наносекунд .

0 голосов
/ 01 октября 2011

Вы не можете спать менее миллисекунды, используя Thread.sleep(long) - и на многих платформах вы обнаружите, что даже сон в течение одной миллисекунды будет на самом деле спать дольше (например, 15 миллисекунд) в зависимостина детализацию системных часов.

Другими словами, вы в принципе не можете делать то, что пытаетесь сделать с Thread.sleep(long) - и попытка получить время с точностью до миллисекунды проблематична впервое место.Вместо этого вы можете попробовать использовать System.nanoTime(), что соответствует только , подходящему для прошедшего времени (в данном случае это нормально) - и вы могли бы захотеть рассмотреть вращение-блок, чтобы ждать до нужного времени, вместо того, чтобы спать.

В большинстве случаев плохая идея даже попытаться выполнить что-то с фиксированной скоростью 1000 вызовов в секунду, хотя ..какой тут случай использования?Там может быть лучший подход.

РЕДАКТИРОВАТЬ: я только что заметил, что есть Thread.sleep(millis, nanos) - вы могли бы попробовать , используя этои спать в течение, скажем, 0 миллисекунд и 100000 наносекунд.Вы должны знать, что на большинстве платформ это на самом деле не будет делать то, что вы хотите.Вы можете попробовать его для своего конкретного случая использования, но я бы лично не слишком надеялся.

0 голосов
/ 01 октября 2011

Это невозможно.1 мс - это даже больше, чем 1 мс (15,6 мс), и это не гарантируется.

-> Можно ли улучшить разрешение Thread.Sleep?

...