0

我一直在学习 Java(Oracle Press Books),我正在学习线程。这些示例与书中的内容有些不同。到目前为止,这是可以理解的。然而这个最新的似乎有点奇怪。这是代码: http: //pastebin.com/tu0qajMF

这些程序演示了线程之间使用 wait() 和 notify() 的通信。它有一个对象,有两个同步方法tick 和tock。它们只是显示滴答和滴答。运行示例时,它应该运行“Tick Tock Tick Tock ...”,它通常会这样做。然而有时它会变成“Tock Tick Tock Tick”。

为什么要这样做?

我怎样才能改变代码,所以它不会?

4

2 回答 2

3

在线程启动之前您没有进行任何预同步,因此这是一场关于谁先运行的竞赛。在第一次加入之前,您不会到达同步点,因此两个线程中的任何一个都可能在该点启动。

于 2012-12-05T15:08:26.180 回答
0

我通过添加一些预同步解决了这个问题,我在潜意识中留下了大约 15 分钟后发现了一种方法,在 Facebook 上发了一些帖子,然后我有了一个想法。解决起来比我想象的要简单得多。

在 TickTock 类中,我添加了一个成员“boolean virginity=true”,如果纯真为真,则让 Tock 等待,并在运行时将纯纯设置为假。所以当 MyThread 运行时,Tick 总是首先运行——因为两个线程共享的对象有一个变量,它确保 Tock 等待 Tick 并且没有竞争。

代码在这里: http: //pastebin.com/AHCvcNa8

如果没有第一个问题的答案,我将无法解决这个问题,所以谢谢第一个问题回答者。

于 2012-12-05T18:32:29.627 回答