加入不完整的执行

时间:2014-09-05 19:20:18

标签: java multithreading join concurrency

这段代码存在一些问题,它没有执行。但是,当我取消注释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");
    }

}

1 个答案:

答案 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