3

在我正在使用的代码中

Thread.currentThread().sleep(sleepTime);

在代码的主要(非线程对象)部分。

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

有没有更好的方法可以让你的主要进程静置一段时间?还是这是规定的方法?

编辑:

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

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

换句话说...

东西...

连接远程...

用远程连接做事...

紧密连接...

更多东西...

根据需要重复。

我发现在非常非常罕见的情况下,这种连接会进入 la la land。它不会失败,也不会抛出任何异常,它就会消失。而且它是阻塞的,所以没有在线方式来设置计时器。

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

东西...

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

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

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

或者

b)等待一些预设的时间,如果连接线程还没有报告它已经完成,杀死它并继续。

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

它似乎比坐在标准while循环中更有效(在处理器上),因为这确实会干扰连接线程执行其需要执行的操作。

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

4

8 回答 8

13

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

如果您可以提供更多说明为什么需要暂停以及您正在编写的应用程序类型,那将有所帮助。

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

Thread.sleep(sleepTime);

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

您应该查看您的 IDE 是否可以选择通过引用调用静态方法成为警告或错误 - 它会导致误导性代码(像这样)。

于 2009-03-12T21:05:46.777 回答
4

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

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

于 2009-03-12T21:05:12.863 回答
3

这并不危险,但在 99+% 的情况下,当您认为需要它时,实际上并不需要。你想做什么?

于 2009-03-12T21:03:09.903 回答
3

好吧,Thread.sleep 是一个静态方法,所以它很容易产生误导。此外,如果您需要关闭操作,您也无法干净地醒来(您可以打断,但我认为那是干净的)。

于 2009-03-12T21:05:12.880 回答
2

如果您决定使用Thread.sleep,请确保正确处理 InterruptedException

于 2009-03-12T21:34:29.720 回答
0

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

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

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

于 2009-03-12T22:01:56.987 回答
0

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

于 2009-03-14T12:46:37.813 回答
0

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

于 2009-03-14T13:47:41.347 回答