【问题标题】:Is java multithreading different on different OS?java多线程在不同的操作系统上是否不同?
【发布时间】:2018-10-16 03:31:02
【问题描述】:

我正在使用 java 制作一个模拟餐厅的多线程程序。我正在使用最新的 Eclipse Java Oxygen 来做到这一点。我尝试在 windows 10 和 linux mint 上运行它,总是使用 Eclipse,它在 windows 上运行良好,但是当我在 linux 上尝试 SAME 项目时它停止了。在windows和linux上运行多线程程序有什么区别吗?

谢谢

【问题讨论】:

  • 是的(显然)。我们可以看看一些代码吗?
  • 它停止”是什么意思?有错误吗?您确定您的问题与并发有关,而不是某些特定于 Windows 的依赖项吗?
  • “它停止”我的意思是它卡在某一点上,但没有错误。
  • 导致死锁的代码是否涉及任何IO,例如从文件读取或跨机器发送数据?如果没有更多信息,即使是一种可能性也很难确定。请创建一个MCVE,以便我们重现问题。
  • 是的,它通过在日志文件上注册问题的所有状态来涉及 IO,但为了做到这一点,我正在使用我的老师提供的库,所以我认为它运作良好。跨度>

标签: java multithreading operating-system


【解决方案1】:

因为 Java 是为跨操作系统而构建的,所以无论操作系统如何,您的代码都应该没有区别。这意味着如果您的应用程序在其中使用多个线程,只要您的实际应用程序按您希望的方式运行,它就可以在任何操作系统上运行。出现这种情况的原因是,Java 将 .java 中的 Java 代码转换为 .class 中的 byteCode,这将转换为每个操作系统的汇编代码。可能会阻止您的程序的是 Java 已过时,或者完全没有安装。如果两者都不是,那么您可以查看诸如 RAM 可用性和 Linux Mint 中每个程序的任何类型的线程限制。

【讨论】:

  • 谢谢!非常感谢您的回答。这正是我的想法,但我真的不知道我在 Linux Mint 上遇到了什么问题,必须检查一下。所以我可以说我有正确的代码,如果它在 Windows 上运行(它是完美的),对吧?
  • 是的,没错。据我所知,只要您的应用程序不依赖于任何特定于 Windows 的应用程序,您应该可以在任何操作系统上运行它。
  • @Kwright02 - 您还假设 OP 的代码中没有与线程相关的错误。否则称为 heisenbugs。此类错误通常会导致应用程序在不同平台上的行为不同。
  • 是的,我假设,我在回答中这样说
  • 我在评论你的评论。您在哪里回答 OPs 的问题:“所以我可以说我有正确的代码,如果它在 Windows 上运行(它是完美的),对吧?”。你说是的。正确答案其实是不。
【解决方案2】:

Java 中的多线程依赖于操作系统来调度本机线程。本机线程调度程序由操作系统本身在内核中实现。它们是具有不同行为的不同代码段。而且它们也(可能)在系统级别可调。

是的,有一些差异会影响 Java 应用程序的运行方式,但很难弄清楚它们是什么……更不用说简单地描述它们了。

您看到的问题也可能是由于不同执行平台之间的其他一些差异造成的:有很多可能性。或者这可能是由于您的应用程序与文件系统或网络或外部应用程序通信的方式,所有这些都有差异。


我建议您首先使用可用的调试工具来描述“停止”时发生的情况。线程死了吗?线程是否被锁阻塞?等等。然后寻找具体行为的具体原因。

请注意,Java 线程新手会犯两种“经典错误”:

  1. 对线程如何运行做出无根据的假设;例如线程被公平调度,或者它们将以直观顺序启动和运行。

  2. 同步不足;例如当两个或多个线程在没有充分同步的情况下访问和/或修改共享变量或数据结构时。 (这可能导致不可预测且高度反直觉的行为。)

说完了,你可以编写一个多线程Java程序在许多平台上正常工作。但是除非您清楚地描述问题并向我们展示相关代码,否则我们无法帮助您解决具体问题。在这种情况下,强烈建议使用 MCVE。

【讨论】:

  • 只要编写的代码遵守规范,这些不一致的地方不就被认为是内存模型或使用的VM实现的错误吗?
  • 在这种情况下,他需要遵守的规范包括很多除了 JLS 17.4 之外的东西。例如所有你不能假设的关于线程、通知/等待等的事情。
  • 我只是没有发布代码,因为这是一个非常大的任务,甚至相关的代码也很长很复杂。无论如何,我会听从你的建议。谢谢!
  • 我建议您将应用程序减少到 MCVE(最好!!),或者发布与多线程相关的代码部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多