Eclipse和Command Line的Java输出不同

时间:2009-08-13 14:11:55

标签: java eclipse command-line compilation

我是否有任何明显的原因可以解释为什么我从Eclipse IDE的输出运行的Java程序与我在Windows(XP)中使用命令行执行相同操作时所获得的不同?我使用的是JDK 1.6.0_04和Eclipse 3.4.0

程序创建线程然后测试锁定算法。在Eclipse中,线程不会相互干扰。但是,使用javac,线程会相互中断。

6 个答案:

答案 0 :(得分:2)

如果你正在玩线程,控制台输出可能会因机器而异,我确信eclipse会以某种方式影响线程。

答案 1 :(得分:2)

可能导致不同行为的一件事是,如果你有ie。两个提供相同功能的罐子(即同一个罐子的两个版本)。根据您指定类路径的方式,一个jar中的代码可以覆盖另一个jar。

现在在eclipse中,顺序可能与命令行上的顺序不同 - 因此您实际上调用的是不同的代码,从而产生不同的输出。

答案 2 :(得分:1)

我的印象是Eclipse有自己的内置编译器(Google搜索确认我是对的)。它与javac的编译方式可能略有不同。

答案 3 :(得分:0)

是的,也许Eclipse已经启用了一个JAVA选项,如详细的垃圾收集或其他东西。您通常可以使用[jre] /bin/Jconsole.exe连接到JVM,以查看JVM上启用的内容,然后您可以进行比较。这将显示类路径以及其他内容的差异。要完成这项工作,您需要将其作为启动选项添加到要检查的jvm中:
-Dcom.sun.management.jmxremote

答案 4 :(得分:0)

您确定在必要时正确地同步了线程吗?

线程是否相互依赖?如果是这样,这可能是造成行为差异的原因。

尝试分析您的计划。如果线程1比线程2更快地完成,程序是否会工作?如果线程2比线程1更快地完成,程序是否会工作?

例如,如果线程1生成稍后将由线程2使用的结果。是否有任何保证线程2在生成之前不尝试使用该结果? (假设线程2运行得非常快)

总结:如果程序严重同步,不同的相对执行时间可能是行为差异的原因

答案 5 :(得分:0)

我假设你说“线程互相中断”你的意思是两个线程的输出是散布的。我还想象你正在写System.err或System.out。

我相信你所看到的是两个线程对同一个流进行非同步输出的结果。在Eclipse中,您正在写入的流具有足够的缓冲,以致对write()的调用不会停止(99.9%的时间)。相比之下,当您从命令行运行时,很可能每次Java write()调用都会导致写入系统调用,从而停止一个线程并调度另一个线程。实际上,Java write()甚至可能变成多个写系统调用!

简单的答案是尝试更改流的缓冲。不幸的是,我不认为Java API允许您为控制台标准输出/错误流执行此操作。

其他不完美的答案包括:

  • 更改您的应用程序以同步System.out / err对象上的所有写入。不幸的是,这很容易掩盖你试图测试的代码中的同步错误!!

  • 将您的应用程序更改为输出到ByteArrayOutputStream()。这将减少“中断”的变化,但除非你同步,否则它偶尔会发生。

我能想到的最好的答案是创建一个包装器Stream / Reader类,它将写入同步到ByteArrayOutputStream,将所有消息写入实例,然后在测试时将批次转储到System.out(或任何地方)完成。这可能会掩盖同步错误,但与在System.out / err对象上进行同步的可能性要小得多。