繁体   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