【问题标题】:Incomplete execution with join连接执行不完整
【发布时间】:2014-09-05 19:20:17
【问题描述】:

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

}

【问题讨论】:

  • 这对我来说还为时过早,所以我重新打开了。
  • 您确定您不只是等待 5 秒吗?
  • 是的,你也可以试试eclipse,希望你能得到同样的结果
  • 我非常怀疑你的结果。请将您的sleep 转为喜欢1000。并在run() 中添加sleep,以免填满控制台缓冲区。
  • 这将改变问题。 :(

标签: java multithreading join concurrency


【解决方案1】:

您的代码没有问题,这是 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 错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=443433

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2017-08-31
    • 2016-02-23
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多