【发布时间】:2009-12-09 08:01:25
【问题描述】:
这是我关于 S.O. 的第一个问题
我有一个非常奇怪的问题。
下面是我的问题...
我编写了非常简单的方法,将一些文本写入文件。
当然在我的机器上效果很好(XP, 4CPU, jdk1.5.0_17[SUN])
但它有时会在运行服务器上冻结
(Linux Accounting240 2.4.20-8smp,4CPU,jdk1.5.0_22[SUN])。
kill -3 不起作用。
ctrl + \ 不起作用。
所以,我不能给你看线程转储。
它冻结得很好..
当我只是用这种方法写一些 Thread.sleep(XX) 时,问题就解决了(?)...
sleep(XX) break... 今天又发生了 Thread.sleep(XX) )...
你知道这个问题吗? 你有一些解决方案吗? 谢谢。 :-)
附言
linux 发行版:Red Hat Linux 3.2.2-5
命令:java -cp。
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class T {
private BufferedWriter writer = null;
private void log(String log) {
try {
if (writer == null) {
File logFile = new File("test.log");
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(logFile, true)));
}
writer.write(new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss] ")
.format(new Date()));
writer.write("[" + log + "]" + "\n");
writer.flush();
/*
* this is ad hoc solution ???
*/
//Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
public void test() {
long startTime = System.currentTimeMillis();
while (true) {
log(String.valueOf(System.currentTimeMillis()));
System.out.println(System.currentTimeMillis());
try {
//Thread.sleep((int) (Math.random() * 100));
} catch (Exception e) {
break;
}
if (System.currentTimeMillis() - startTime > 1000 * 5) {
break;
}
}
if (writer != null) {
try {
writer.close();
} catch (Exception e) {
}
}
System.out.println("OK");
}
public static void main(String[] args) {
new T().test();
}
}
【问题讨论】:
-
如果您想进行日志记录,我强烈建议您使用现有的日志记录框架,如果这是您可以选择的选项。想到 log4j 或 slf4j。
-
或 java.util.logging。随您的 JDK 一起提供。
-
在我的双核 Ubuntu AMD64 机器(Sun 的“服务器”虚拟机)上运行 5 次后无法重现。 java version "1.6.0_0" OpenJDK Runtime Environment (IcedTea6 1.6.1) (6b16-1.6.1-3ubuntu1) OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
-
是的.. 我绝对同意你所说的。但是我的最终程序的功能非常小,将文本写入数据文件和记录。就该程序可以将文本写入文件而言,它可能会再次发生。所以,我很担心这个。谢谢,布赫。
-
运行服务器上的JDK版本为Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03) Java HotSpot(TM) Server VM (build 1.5.0_22-b03, 混合模式) )。我执行 java -client -cp 。 T 没有 Thread.sleep 代码,问题就消失了......我根本无法理解。嗯……
标签: java linux file multiprocessor