Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在我的主代码中使用Thread.currentThread.sleep()有什么危险吗?_Java_Multithreading_Sleep - Fatal编程技术网

Java 在我的主代码中使用Thread.currentThread.sleep()有什么危险吗?

Java 在我的主代码中使用Thread.currentThread.sleep()有什么危险吗?,java,multithreading,sleep,Java,Multithreading,Sleep,在我的代码中,我正在使用 Thread.currentThread().sleep(sleepTime); 在代码的主(非线程对象)部分 它似乎运行良好,但我担心可能会有一些隐藏的陷阱,稍后会咬我的屁股 有没有更好的方法让你的主要流程搁置一段时间?或者这是规定的方法 编辑: 为了回答我为什么要这样做 我有一个进程,可以通过HTTP或FTP连接到远程主机并执行一些操作 换句话说 东西 连接到远程 做一些与远程连接 密切联系 更多的东西 必要时重复 我发现在非常罕见的情况下,这种联系只会传到洛杉矶

在我的代码中,我正在使用

Thread.currentThread().sleep(sleepTime);
在代码的主(非线程对象)部分

它似乎运行良好,但我担心可能会有一些隐藏的陷阱,稍后会咬我的屁股

有没有更好的方法让你的主要流程搁置一段时间?或者这是规定的方法

编辑:

为了回答我为什么要这样做

我有一个进程,可以通过HTTP或FTP连接到远程主机并执行一些操作

换句话说

东西

连接到远程

做一些与远程连接

密切联系

更多的东西

必要时重复

我发现在非常罕见的情况下,这种联系只会传到洛杉矶。它没有失败,它没有抛出任何异常,它只是消失了。 而且它是阻塞的,所以没有在线方式来设置计时器

所以,我的解决方案是这样做

东西

启动包含连接的新线程

进入一个无限循环,在主进程中使用一个计时器(不在派生线程中),然后等待其中一个

a) 连接线程完成其任务并将某些标志设置为“完成”

b) 等待一段预设的时间,如果连接线程尚未报告它已完成,请终止它并继续

这是在主要的过程中,我打算睡一段时间,醒来,看看最大等待时间是否已经过期。如果没有,那就回去睡觉,再等一会儿

它(在处理器上)似乎比坐在标准while循环中要高效得多,因为这实际上会干扰连接线程执行它需要执行的任务


我想我的问题真的是。。。这种方法有什么不安全的地方吗。我从答案中看到,考虑到我所做的,似乎没有。也许我应该问问是否有更标准化的方法?

这并不危险,但在99%以上的情况下,当你认为你需要它时,你真的不需要。你想干什么?

没有陷阱。只要你让它睡觉,它就会一直睡


应用程序长时间处于休眠状态的想法可能存在也可能不存在陷阱。

嗯,Thread.sleep是一种静态方法,因此它非常容易误导。此外,如果您需要关闭操作,您也不能被完全唤醒(您可以中断,但我不认为这是干净的)。

您正在编写什么样的应用程序?这很少是一个好主意,如果您正在编写客户机GUI,那么这是一个特别糟糕的主意——当线程处于休眠状态时,它将不会响应

如果您能给出更多的指示,说明为什么需要暂停,以及您正在编写的应用程序的类型,这将有所帮助

还有一件事-你的电话应该是:

Thread.sleep(sleepTime);
通过
currentThread()
调用它会使它看起来像是一个实例方法,但事实并非如此——它只是一个普通的静态方法。你不能让其他线程睡眠


您应该看看您的IDE是否有一个选项,可以通过引用将静态方法调用成警告或错误-这会导致误导性代码(如下所示)。

如果您决定使用,请确保。

连接“消失”是什么意思?当然没有内联方式来设置计时器,但是如果需要,可以设置连接超时和读取超时

创建无参数构造函数的套接字,调用connect(SocketAddress,int),以便设置超时(以毫秒为单位)。如果此时无法建立连接,将引发异常


您可以在连接之前调用setSoTimeout(),这样对read()的任何调用都只会阻塞指定的时间,而不是永久阻塞。如果无法在指定的时间内读取数据,则会引发异常。

AFAIR浪费CPU时间,而不会。因此,您应该始终使用
Object.wait(长超时)
。虽然我找不到任何支持我论文的镜头,但我认为当切换到
Object.wait(长超时)
调用时,我们获得了很大的性能提升。

人们经常使用定时器来执行延迟事件,但我更喜欢ScheduleExecutor服务。您可以对所有超时操作使用相同的线程池。(你可以拥有一个大小为1的线程池)

你在等待什么特别的东西吗?好吧,只要你告诉它,它就不会一直处于睡眠状态。它可以被另一个线程中断。有趣的链接(+1)。我讨厌sleep抛出一个checked异常,现在我更讨厌它,但至少我知道,在某些情况下,我至少应该承认它(恢复中断状态)。不过,我从未见过它会在睡眠中导致不需要中断的问题。出于习惯,我在catch块中调用Thread.currentThread().interrupt()。也许出于习惯这样做不是一件好事,但(我认为)这比忽略例外要好。我想到了这一点,但我不确定这个过程“消失”的确切位置(它确实消失了,我没有其他方式来描述它。它永远存在,什么也不报告)。我的计时器是一个包罗万象的计时器,而您的方法只捕获连接和读取。有没有一个原因…计时器是个坏主意?我认为只有95%以上的情况