Java 禁用Thread.sleep()

Java 禁用Thread.sleep(),java,Java,我想禁用在java项目中使用Thread.sleep()的可能性,并改用我自己的方法: sleep(int time, String info) 这将等待给定的时间量,并打印信息为什么在这里等待是必要的 是否可以禁用Thread.sleep() 如果是,最好的方法是什么?是的,当然可以 只需确保该项目中没有任何代码正在调用Thread.sleep();但是您的MyUtility.sleep()替换 如果问题是:我能否以某种方式更改现有线程.sleep()的行为,那么答案是:取决于您愿意花费的上

我想禁用在java项目中使用Thread.sleep()的可能性,并改用我自己的方法:

sleep(int time, String info)
这将等待给定的时间量,并打印信息为什么在这里等待是必要的

是否可以禁用
Thread.sleep()

如果是,最好的方法是什么?

是的,当然可以

只需确保该项目中没有任何代码正在调用
Thread.sleep()
;但是您的
MyUtility.sleep()
替换

如果问题是:我能否以某种方式更改现有线程.sleep()的行为,那么答案是:取决于您愿意花费的上下文/精力


嗯,有一些把戏,;这是可能的;但简单地说:这很可能是个坏主意;也不值得继续跟进。如果我研究那些可以在编译时识别不需要的睡眠调用的用法的解决方案,我真的会避免更改代码行为

最好的方法是在一些静态代码分析工具上挂起钩子,以便在调用
Thread.Sleep()
时将构建标记为失败


您可能可以配置为执行此操作。

您可以使用AOP截获对Thread.sleep()的调用,并通过aroundAdvice“重定向”对Thread.sleep()的调用。调用原始Thread.sleep()时,会添加一个“默认原因”。这个例子展示了如何使用它(记住创建AspectJ项目,否则AspectJ将无法工作):

SleepAspect.java

SleepClass.java

当你运行它时,你会收到类似的消息

CAUSE: I love to sleep 1000 sleep well for 1000ms! CAUSE: Thread.sleep invoked in org.norsam.so.sleep.SleepClass.main, no cause present! sleep well for 2000ms! Bye 原因:我喜欢睡觉 睡好1000毫秒! 原因:在org.norsam.so.sleep.SleepClass.main中调用了Thread.sleep,不存在原因! 睡好2000毫秒! 拜伊
问题是Thread.sleep()的出现次数太多,无法全部更改它们吗?好吧,我们必须全部更改它们,但我必须确保没有人会在之后使用Thread.sleep()。(测试目的)你不能确定。一种解决方案是在代码分析器(如Sonar)中设置一条规则,在每次出现
Thread.sleep()
时都会升起一个标志。唯一的解决方案是编写一个程序,扫描源代码以查找
Thread.sleep()
。(如果您随后将其链接到
git
,您可能会向编写该行的程序员发送一封电子邮件。)提示:阅读如何正确使用我们的标记编辑功能-您不使用HTML标记。你看,编辑窗口中所有帮助文本的存在都是有原因的;-)。。。不要忘了在某个时候接受最有用的答案。好吧,即使Thread.sleep()无法更改,也肯定可以成为控制器:IMHO方面不是一个“肮脏的把戏”,所以我不认为“no”可能是正确的答案,也许“complex”更合适……)然后,我使用AOP添加了一个快速而肮脏的工作示例。您可能是对的,我尝试相应地重写了我的答案。PS:显然,您可以选择抛出异常,而不是在线程上打印默认消息。在自定义睡眠方法之外的sleep()调用…:)
package org.norsam.so.sleep

public class SleepClass {

    public static void sleep(long l, String cause) {
        System.out.println("CAUSE: " + cause);
        try {
            Thread.sleep(l);
        } catch (InterruptedException e) {
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SleepClass.sleep(1000, "I love to sleep 1000");
        Thread.sleep(2000L);
        System.out.println("Bye");
    }

}
CAUSE: I love to sleep 1000 sleep well for 1000ms! CAUSE: Thread.sleep invoked in org.norsam.so.sleep.SleepClass.main, no cause present! sleep well for 2000ms! Bye