在制作聊天应用程序时,我的自我真的很困惑。这就是我的问题所在。我在应用程序中有很多类。其中一个负责通信,因此它的发送和接收消息(当消息很像观察者模式时,通过调用接收方法的第二个线程完成接收)。我无法弄清楚如果在应用程序尝试发送消息的同时收到消息将会发生什么。应用程序是否正常运行,因为从另一个线程调用了receive?
由于
ps:我仍处于设计阶段,这就是为什么我不只是测试它。
答案 0 :(得分:1)
您熟悉java.util.concurrent吗?
如果没有,你应该在编写更多代码之前先去学习它。它将拥有可以帮助您的工具。
答案 1 :(得分:0)
俗话说,魔鬼在于细节。在这种情况下,细节是在不同线程中运行的代码可访问的变量。对于多线程应用程序,同一方法 - 即使是相同的代码行 - 可以同时在两个线程下运行。这里的一个大问题是race conditions:一个线程正在改变一个变量(或一组变量),而另一个线程在假设数据是稳定的情况下读取变量。这通常通过使用synchronized
块(一种锁定形式)在Java中处理。 (还有其他机制,例如volatile
或原子数据结构。)但这会带来第二个危险:死锁。在最简单的情况下,这是两个线程需要在多个资源上同步的地方,每个线程都在等待锁定另一个线程已经锁定的资源。避免死锁的最简单方法是永远不要锁定多个资源,或者在所有线程上以相同的相对顺序获取锁。有关所有这些的更多详细信息,请参阅Java教程Processes and Threads。
我喜欢拟人化线程:将每个线程视为坐在桌子周围的独立工作者。每个工人都有一堆私人文件,但偶尔也会在桌子中央放一堆纸。 (在代码中,通常没有“中心”这样的东西 - 尽管有些设计确实创建了一个单独的类来封装共享数据。)一个工人可以在中心放一个注释,发给其他一个工人,询问进行具体工作;然后,接收工作人员可以将结果发送回给另一个工作人员的中心。除了表格中心的共享数据外,工人独立行事。 (同步包括在中心收集某些文件并暂时将它们放在标有“为XYZ保留”的框中。除XYZ之外的任何工作人员都可以访问纸张,只要它是为XYZ保留的。)请注意,唯一的争用领域多个工作者之间是表格中心的共享数据。
对于您的特定应用程序,听起来您需要至少三个线程:一个管理用户界面;发送消息的人;和一个接收消息。主线程(包含系统调用以启动应用程序的代码的主线程)应该是UI线程,它应该启动另外两个线程。 UI线程和其他两个线程之间显然会有相互作用。根本不清楚发送线程和接收线程之间是否需要进行任何交互;将它们设计为没有共同的(可修改的)数据可能非常容易。
在您描述设计的非常抽象的层面上,我认为它没有任何固有的问题。我建议您继续编码,记住共享数据访问和同步的问题。如果遇到特定问题,你总是可以寻求帮助。