gpt4 book ai didi

线程中的 Java : Thread. sleep():无需等待

转载 作者:搜寻专家 更新时间:2023-11-01 02:11:24 26 4
gpt4 key购买 nike

我有一个线程没有 hibernate 的问题。
我不能把我的整个代码放在这里。因此,为了重现,这里有一个等待 5 秒的基本代码。

try {
int millisec = 5000;
System.out.println(new Date());
System.out.println("We wait " + millisec + " milliseconds");
Thread.sleep(millisec);
System.out.println(new Date());
} catch (Exception e) {
e.printStackTrace();
}

输出:

2013 年 8 月 22 日星期四 20:01:42
我们等待 5000 毫秒
2013 年 8 月 22 日星期四 20:01:47

一切正常。
但是当我把这段代码放在一个线程中时,没有 sleep 。此代码示例:

try {
Thread aThread = new Thread(new Runnable() {
@Override
public void run() {
try {
int millisec = 5000;
System.out.println(new Date());
System.out.println("We wait " + millisec + " milliseconds");
Thread.sleep(millisec);
System.out.println(new Date());
} catch (Exception e) {
e.printStackTrace();
}
}
});
aThread.start();
} catch (Exception e) {
e.printStackTrace();
}

输出:

2013 年 8 月 22 日星期四 20:07:30
我们等待 5000 毫秒

...仅此而已,线程已终止。
我不明白为什么。请问有什么想法吗?

编辑:我使用 Eclipse 和 JUnit 进行测试。

最佳答案

编辑:

问题出在 JUnit 的工作方式上。它不知道后台线程已生成,因此当测试线程完成时,它会杀死其余线程而不等待它们。


当我在一个小的 main() 类中尝试时,您的代码正确地输出了两条日期线。以下是您在应用程序中看不到输出的一些可能性:

  • 生成aThread 的线程本身可能是守护线程。 aThread 因此是守护进程,因为它的守护进程状态是从生成线程的状态中获取的。如果 JVM 第二个 System.out.println(...) 之前完成,aThread 将被杀死。如果对此有疑问,您应该这样做:

    Thread aThread = new Thread(new Runnable() {
    ...
    // ensure the deamon flag is off _before_ we start the thread
    aThread.setDaemon(false);
    aThread.start();
  • 另一种可能性是某些东西实际上在第二次 println(...); 之前关闭了 System.out。不太可能但可能。您是否使用关闭 Hook 进行清理?

  • 第三种可能性是实际上正在打印输出,但您的 IDE 或控制台以某种方式没有显示输出。

  • 另一种可能性是 System.out.println(...); 抛出了一个 IOException。检查 System.out.checkError() 的值以查看它是否为 true 可能很有趣,尽管我不确定您随后将如何显示它。

尝试的一件事是创建一个临时文件而不是打印输出。像这样的东西:

new File("/var/tmp/" + System.currentTimeMillis()).createNewFile();

然后您应该在 "/var/tmp"(或操作系统上的任何临时目录)中看到 2 个文件。

您还应该尝试将 System.out 更改为 System.err 以查看是否有任何改变。有疑问但值得一试。

如果这些都不能正常工作,那么某些东西会强行杀死 JVM,因此它无法等待后台线程。

关于线程中的 Java : Thread. sleep():无需等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18388263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com