Как проверить результат, когда поток закончен - Java - PullRequest
0 голосов
/ 05 мая 2018

Как я могу проверить тему? Я получил MyClass, и я хотел бы проверить его. Я знаю, что в списке чисел, и я хотел бы проверить, является ли в onThreadFinished (String someString) правильное строковое значение, когда поток завершается. Итак, как создать тест для метода onThreadFinished (String someString) после завершения потока.

class MyClass {

  public void startMyClass(List numbers) {
      Thread thread = new Thread() {

        @Override
        public void run() {

          while(...) {
            // ...do something...
          }

          onThreadFinished(someString);
        }
      }
      thread.start();
  }


  protected void onThreadFinished(String someString) {
  }

}

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Случай 1: что-то сделать, затем подождать результатов и продолжить.

myThread.join() - для случаев, когда код, создавший поток, выполняет еще кое-что после запуска потока, а затем хочет дождаться результата потока. Как только код потока готов, поток умирает, и, следовательно, приложение продолжает выполнение после вызова join ().

Чтобы предоставить информацию о приложении из потока, вам нужно ее где-то сохранить, например, в поле, предназначенном для этого. Вам не нужно беспокоиться о синхронизации, потому что после того, как поток умирает, все его действия станут «общеизвестными», они больше не будут работать по расписанию (или что-то еще).

Случай 2: Продолжайте делать что-то и регулярно проверяйте, есть ли результаты.

Если вместо этого вы намерены создать какой-то игровой цикл, в котором вы продолжаете делать что-то, а ваша дополнительная нить предназначена только для того, чтобы в конечном итоге доставить вам некоторые товары (например, визуализировать фоновое изображение звезды, когда ваша игра уже запущена) , снова вы должны передать его приложению в поле (он же переменная класса).

В этом случае, однако, вам нужно беспокоиться о синхронизации. Потому что, поскольку игровой цикл продолжает проверять, изменилось ли поле с null на значение, два потока соревнуются друг с другом.

Итак, в этом случае вам потребуется дополнительный объект для синхронизации, в идеале выделенный для этой задачи, например, final private Object lockForBackgroundCalculation = new Object();, и когда поток записывает свое значение результата в другое поле, вы переносите этот оператор в synchronized(lockForBackgroundCalculation){...}, а также сверяете проверку игрового цикла значения поля в тот же текст блока синхронизации.

0 голосов
/ 05 мая 2018
Thread.join()

join () Ожидает смерти этой нити.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...