簡體   English   中英

OSX High Sierra上的Java教程揭示了線程問題

[英]Threading issue revealed with Java tutorial on OSX High Sierra

我一直在cleancoders.com上關注Java案例研究

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

提交名稱是“第3集西紅柿第6集”

我正在使用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社區版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();
   }
 }

我很困...所以任何幫助將不勝感激。

謝謝!

卡住

附加說明:

如果我下載完成的項目,則會遇到相同的問題,因此很明顯,該教程無法解決該錯誤...

https://github.com/cleancoders/CleanCodeCaseStudy

更新資料

我找到了Windows計算機並將其安裝在該計算機上,但未顯示此問題。 因此,現在我可能不得不得出結論,這與我使用的此Mac有關。 速度非常快:

2.3 GHz Intel Core i5
8 GB 2133 MHz LPDDR3

也許是因為其他計算機速度較慢,或者是與Java版本有關,所以它能夠揭示問題,無論如何,我可以繼續這樣做,而不是被阻止。 我將更改標題以反映這一點。

你有:

synchronized(readingService) {
     readingService.wait();

但是,您要在“ this”上通知線程,您需要通知對象引用readService。 您所擁有的是通知錯誤對象的經典情況。

使用“ this”進行等待/通知通常是一個壞主意。 很難弄清楚“此”指的是什么。 我不會去github查看其他代碼。

如果可以修改代碼,則將對readingService的引用傳遞給實現TestSocketService的Class。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM