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

时间:2009-03-12 21:01:37

标签: java multithreading sleep

在我的代码中我正在使用

Thread.currentThread().sleep(sleepTime);

在代码的主(非Thread对象)部分。

它似乎工作正常,但我担心可能会有一些隐藏的陷阱,以后会在我的屁股中咬我。

有没有更好的方法让您的主要流程保持一段时间?或者这是规定的方法吗?

编辑:

回答我为什么这样做......

我有一个通过HTTP或FTP连接到远程主机并执行操作的进程。

换句话说......

东西...

连接到远程...

做远程连接...

关闭连接...

更多东西......

根据需要重复。

我发现在非常罕见的情况下,连接只会进入la la land。它不会失败,它不会抛出任何异常,它就会消失。 并且它是阻塞的,因此没有设置计时器的内联方式。

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

东西...

启动带有连接的新线程......

使用MAIN进程中的计时器进入无限循环(不是在生成的线程中)并等待

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

b)等待一段预设的时间,如果连接线程没有报告它已经完成,请将其终止并继续。

在主要过程中,我打算睡一段时间,醒来,看看MAX_WAIT_TIME是否已经过期。如果没有,请回去睡觉再等一会儿。

在处理器上看起来比在标准while循环中更有效率,因为这会干扰连接线程做它需要做的事情。

我想我的问题确实是......这种方法有什么不安全之处。我从答案中看到,鉴于我正在做的事情,看起来没有。也许我应该问是否有更标准化的方法?

8 个答案:

答案 0 :(得分:13)

你在写什么样的申请?这很少是一个好主意,如果您正在编写客户端GUI,那么这是一个特别坏主意 - 当线程处于休眠状态时,它将无法响应。

如果您可以提供更多关于您需要暂停的指示以及您正在编写的应用程序类型,那将会有所帮助。

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

Thread.sleep(sleepTime);

通过currentThread()调用它使看起来就像它是一个实例方法,但它不是 - 它只是一个普通的静态方法。你不能让任何其他线程睡眠。

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

答案 1 :(得分:4)

没有陷阱。只要你告诉它就会睡觉。

您的申请长时间入睡的想法可能存在或可能没有陷阱。

答案 2 :(得分:3)

这并不危险,但在99 +%的情况下,当你认为自己需要它时,你真的没有。你想做什么?

答案 3 :(得分:3)

嗯,Thread.sleep是一个静态方法,所以它非常具有误导性。此外,你不能干净地醒来(你可以打断,但我会说这是干净的),万一你需要关闭动作。

答案 4 :(得分:2)

如果您决定使用Thread.sleep,请确保handle the InterruptedException appropriately

答案 5 :(得分:0)

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

使用no-args构造函数创建套接字,调用connect(SocketAddress,int),以便设置超时(以毫秒为单位)。如果在该时间内无法建立连接,则抛出异常。

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

答案 6 :(得分:0)

AFAIR Thread.sleep()会浪费CPU时间,Object.wait(long timeout)则不会。所以你应该总是使用Object.wait(long timeout)。虽然我找不到任何支持我的论文的镜头,但我认为当切换到Object.wait(long timeout)来电时,我们获得了很大的性能提升。

答案 7 :(得分:0)

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