这段代码存在一些问题,它没有执行。但是,当我取消注释finally块时,它只打印“完整”而不打印“holas”,任何想法?
import java.util.ArrayList;
import java.util.List;
public class MyThread {
/**
* @param args
*/
public static boolean interruptTask=false;
public static class D extends Thread{
public void run(){
while(!interruptTask){
System.out.print("Hello");
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread task = new D();
task.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
interruptTask=true;
try {
task.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}/*finally{
System.out.println("holas");
}*/
System.out.println("complete");
}
}
答案 0 :(得分:3)
您的代码没有任何问题,这是Eclipse中的一个错误。
当我在Eclipse中运行代码时,我得到OP描述的行为。当我从命令行运行生成的类文件时,它按预期工作。我怀疑Eclipse正在缓冲输出并且"忘记"把它写出来到控制台窗口。 println()在print()不支持的情况下工作,但是我希望最终的println()能让Eclipse看到缓冲区。
我还运行了一个测试,我将超时从5000减少到10(毫秒),在这种情况下,Eclipse中的输出是正确的。
我怀疑Eclipse中存储控制台输出的内部缓冲区已填满。我的猜测是Eclipse正在寻找\n
来刷新控制台窗口。它永远不会用OP的原始代码看到这一点,当缓冲区填满Eclipse时,只丢弃额外的输出。由于没有\n
被写入控制台缓冲区,因此永远不会显示它。
我将在Eclipse Bugzilla上提交一个错误。这是一个非常好的测试用例。
编辑:这是一个更好的测试用例:public class EclipseBug
{
private static int count = 781;
public static void main(String[] args)
{
for (int i=0; i<count; i++)
System.out.print("hello ");
System.out.println();
}
}
使用count = 780
可行。使用count = 781
不会产生任何输出。
Eclipse Bug Filed:https://bugs.eclipse.org/bugs/show_bug.cgi?id=443433