Java 运行多线程应用程序

Java 运行多线程应用程序,java,concurrency,Java,Concurrency,在制作聊天应用程序时,我真的把自己搞糊涂了。这就是我的问题所在。我在应用程序中有很多类。其中一个负责通信,以便发送和接收消息(当消息非常类似于观察者模式时,通过调用receive方法的第二个线程进行接收)。我不知道的是,如果在应用程序尝试发送消息的同时收到消息,会发生什么情况。由于从另一个线程调用receive,应用程序是否会正常运行 谢谢 ps:我还在设计阶段,所以我不只是测试它。你熟悉java.util.concurrent吗 如果没有,您应该在编写更多代码之前去学习它。它会有一些工具来帮助

在制作聊天应用程序时,我真的把自己搞糊涂了。这就是我的问题所在。我在应用程序中有很多类。其中一个负责通信,以便发送和接收消息(当消息非常类似于观察者模式时,通过调用receive方法的第二个线程进行接收)。我不知道的是,如果在应用程序尝试发送消息的同时收到消息,会发生什么情况。由于从另一个线程调用receive,应用程序是否会正常运行

谢谢


ps:我还在设计阶段,所以我不只是测试它。

你熟悉java.util.concurrent吗


如果没有,您应该在编写更多代码之前去学习它。它会有一些工具来帮助你。

俗话说,细节是魔鬼。在本例中,详细信息是在不同线程中运行的代码可以访问的变量。对于多线程应用程序,同一方法甚至同一行代码可以同时在两个线程下运行。这里的一个大问题是:一个线程正在更改一个变量(或一组变量),而另一个线程在假设数据稳定的情况下读取变量。这通常在Java中通过使用
synchronized
块(一种锁定形式)来处理。(还有其他机制,如
volatile
或原子数据结构)但这会带来第二个危险:死锁。在最简单的情况下,两个线程需要在多个资源上同步,而每个线程都在等待锁定另一个线程已经锁定的资源。避免死锁的最简单方法是永远不要锁定多个资源,或者在所有线程上以相同的相对顺序获取锁。关于这一切的更多细节可以在Java教程中找到

我喜欢将线程拟人化:将每个线程想象成一个单独的工人围坐在桌子旁。每个员工都有一堆私人文件,但偶尔也会在桌子中央共享一堆文件。(在代码中,通常没有“中心”之类的东西——尽管有些设计确实创建了一个单独的类来封装共享数据。)工作人员可以在中心放一张便条,写给其他工作人员,要求执行特定的工作;然后,接收工作人员可以将结果发送回中心,并发送给另一名工作人员。除了表中心的共享数据之外,工作人员独立地进行操作。(同步涉及在中心收集某些文件,并将其临时放在标有“保留给XYZ”的框中。只有XYZ保留给XYZ的文件,除XYZ以外的任何工作人员才能访问该文件。)请注意,多个工作人员之间唯一的争用区域是表中心的共享数据

对于您的特定应用程序,听起来您至少需要三个线程:一个用于管理用户界面;发送信息的人;和一个接收信息的人。主线程(包含系统调用以启动应用程序的代码的线程)应该是UI线程,它应该启动其他两个线程。显然,UI线程和其他两个线程之间都会有交互。根本不清楚发送线程和接收线程之间是否需要任何交互;将它们设计为在没有(可修改的)公共数据的情况下运行可能非常容易


在您描述设计的非常抽象的层次上,我认为它没有任何固有的问题。我建议您继续编码,记住共享数据访问和同步的问题。如果遇到特定问题,您可以随时寻求帮助。

这取决于应用程序的代码。也许我应该在询问之前多阅读一些内容。我一天前刚刚完成设计,意识到这可能是一个巨大的漏洞。你的客户应该有2个线程。一个线程从输入流读取服务器消息,另一个线程通过输出流向服务器写入消息。读和写可以同时进行。我更困惑的是其他操作会发生什么,如更新GUI等。例如,当我在GUI上写时,会出现一条消息,必须显示出来。网络类工作正常,因此我可以很好地编写和接收消息。这还取决于您使用的GUI。很难知道你在问什么。请更具体一些。谢谢你的回复。我想我需要做更多的研究,然后我才能知道我的设计是否有效。为什么你建议他在不先学习java.util.concurrent的情况下开始编码?@kittylyst-我确实建议OP完成流程和线程教程。这将包括运行辅助线程和线程间交互的基础知识。