Моя ветка не будет спать в течение указанного времени - PullRequest
0 голосов
/ 19 июня 2020

Моя программа предполагает, что гоночные машины "запускают" гонку, а затем распечатывают, кто пришел первым. *

    /**
     * The thread method.
     */
    public void run() {

        Instant start_running = Instant.now();  

                //random_number_generator is a field in Racer declared as:
                //Random random_number_generator = new Random(System.currentTimeMillis());
        Long randomNum = (long) (random_number_generator.nextInt((10 - 1) + 1) + 1);
        long delay = 90L + randomNum;

        try {
            sleep(delay * 10000);

            Instant finished_time = Instant.now();
            long duration = Duration.between(start_raceing, finished_time).toMillis();

            getFinished(this,duration);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /**
     * 
     * @param racer the racer.
     * @param result his time running the race.
     * @return the racer with a new randomized time.
     */
    private Racer getFinished(Racer racer, long result) {

        //update the default result with the new randomized result.
        racer.result = result; 

        //Return the racer with his new time
        return racer; 
    }

Вы можете заметить сон (задержка * 10000); задержка может составлять 97 миллисекунд, и вы правы, я бы не смог этого увидеть, поэтому я добавил множитель 10000, чтобы попытаться замедлить его.

Также, когда я отлаживаю в eclipse, он остановится на строка для sleep () в точке останова; но когда я нажимаю кнопку «Продолжить», чтобы продолжить отладку, похоже, что метод getFinished () не активируется, что является проблемой, потому что я продолжаю получать тот же результат. Этот результат - данные, которые я предоставил гонщикам в основном из текстового файла.

Есть идеи? Я попытался масштабировать от 10 000 до 1 000 000 000, но все равно прошло несколько сотен миллисекунд. Я также попытался использовать вместо этого wait (), но это тоже не замедлило работу.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Я собираюсь предполагать , что Racer extends Thread, и я собираюсь предположить, что вы хотите знать, почему метод run() в вашем первом фрагменте кода возвращается немедленно, независимо от того, как долго ваш Racers сон.

Этот ответ будет действительным, только если мои два предположения верны. Вы можете отредактировать свой вопрос и показать больше своего кода, если я ошибаюсь.


Внутри этого «основного» * ​​1011 * метода у вас есть al oop:

    for(Racer racer : racers) {
        racer.start();
        finished_racers.add(racer);
    }

Этот l oop запускает каждый Racer (который я предполагаю как поток), а затем добавляет Racer в список finished_racers, как только запускается гонщик . *

Что значит «закончено»? Почему гонщик «финиширует» именно в тот момент, когда он стартовал?

Я не знаю, что здесь происходит на самом деле, потому что вы не показали весь свой код и не дали полное описание того, что вы ожидаете от кода или того, что он делает не так, как вы ожидали. Но я надеюсь, что этот «ответ» поможет.


* На самом деле, он может добавить Racer в список finished_racers даже до того, как будет запущен Racer. Когда вы вызываете t.start() для некоторого потока t, нет гарантии, что поток действительно начнет выполнение вашего кода до того, как вызов start() вернется.

0 голосов
/ 19 июня 2020

90 * 10000 это 900 секунд - 15 минут. Вы бы знали.

Вы уверены, что не просто наблюдаете, как все гонщики замерли, ничего не делая? 15 минут - это много. Попробуйте умножить на 30. Теперь каждому гонщику требуется от 2,7 до 3 секунд, чтобы финишировать sh.

...