Проблема с потоками обнаружена в руководстве по Java на OSX High Sierra - PullRequest
0 голосов
/ 10 октября 2018

Я следил за примером Java на cleancoders.com

https://cleancoders.com/videos/java-case-study

Видеоролики также можно найти здесь:

https://www.safaribooksonline.com/videos/clean-code-applied/9780134843810

Вокруг Эпизода 4-5, они добавляют некоторые примитивы синхронизации, которые для меня просто зависают.

Код можно найти здесь в их истории github:

https://github.com/cleancoders/CleanCodeCaseStudy/tree/187e6129de85ad5d33c23ac98a7063b9b35720c5

Имя коммита "эпизод 6 с 3 помидорами"

Я использую OSX 10.13.6

с Java 1.8

java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

С IntelliJ Community Edition 2018.2.4

Так что я в значительной степени застрял сейчас, потому что они двигаются вперед на основе этого кода, а тесты просто зависают ...

Они синхронизируются на объекте службычтобы события происходили в следующем порядке:

Тестовый код, о котором идет речь:

@Test
public void canSendAndReceiveData() throws Exception {
   server.start();
   Socket s = new Socket("localhost", port);
   OutputStream os = s.getOutputStream();
   os.write("hello\n".getBytes());
   synchronized(readingService) {
     readingService.wait();
   }
   server.stop(); 

   assertEquals("hello", readingService.message);
 }
}

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

public static abstract class TestSocketService implements SocketService {
 public void serve(Socket s) {
   try {
     doService(s);
     synchronized(this) { notify(); }
     s.close();
   } catch(IOException e) {
     e.printStackTrace();
   }
 }

Я очень застрял ... поэтому любая помощь будет оценена.

Спасибо!

stuck

Дополнительное примечание:

Если я загружаю готовый проект, у него возникает та же проблемаясно, что учебник не работает с этой ошибкой ...

https://github.com/cleancoders/CleanCodeCaseStudy

Обновление

Я нашел компьютер с Windows и установил его там, и это не показывает эту проблему.Так что теперь я могу сделать вывод, что это как-то связано с этим Mac, который я использую.Это очень быстро:

2.3 GHz Intel Core i5
8 GB 2133 MHz LPDDR3

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

1 Ответ

0 голосов
/ 11 октября 2018

У вас есть:

synchronized(readingService) {
     readingService.wait();

Но вы уведомляете поток об «этом». Вам нужно уведомить объектную ссылку readService.То, что у вас есть, это классический случай уведомления неправильного Объекта.

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

Если вы можете изменить код, передайте ссылку на чтение службы в класс, который реализует TestSocketService.

...