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%以上的情况