我想禁用在java项目中使用Thread.sleep()的可能性,而是使用我自己的方法:
sleep(int time, String info)
那将等待给定的时间,打印信息为什么在这里等待是必要的。
是否可以停用Thread.sleep()
?
如果是,那么最好的方法是什么?
答案 0 :(得分:4)
如果有Thread.Sleep()
的调用,最好的方法是挂钩某些静态代码分析工具,将构建标记为失败。
您可以配置SonarCube来执行此操作。
答案 1 :(得分:2)
是的,当然。
确保该项目中没有代码正在调用Thread.sleep()
;但是你的MyUtility.sleep()
替换。
如果问题是:我可以以某种方式更改现有Thread.sleep()的行为,那么答案是:取决于您愿意的上下文/努力要花。
嗯,有一些技巧; 可能可能;但简单地说:这很可能是一个坏主意;而且不值得追随。我真的会回避改变代码行为,如果有的话,我会研究那些可以在编译时识别不需要的睡眠调用的用法的解决方案。
答案 2 :(得分:2)
你可以使用AOP拦截对Thread.sleep()的调用,并通过aroundAdvice“重定向”你的调用。调用原始Thread.sleep()时,会添加“默认原因”。这个展示了一个关于如何使用它的例子(记得创建一个AspectJ项目,或者Aspects不起作用):
SleepAspect.java
package org.norsam.so.sleep
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class SleepAspect
{
@Around("call (* java.lang.Thread.sleep(..) )")
public Object aroundAdvice(ProceedingJoinPoint point) throws Throwable
{
StackTraceElement ste = Thread.currentThread().getStackTrace()[2];
Long ms = (Long) point.getArgs()[0];
String m = ste.getMethodName();
String c = ste.getClassName();
String skip = SleepClass.class.getName();
if (c.equals(skip) && m.equals("sleep")) {
System.out.println("sleep well for " + ms + "ms!");
} else {
SleepClass.sleep(ms, "Thread.sleep invoked in " + c + "." + m + ", no cause present!");
}
Object toret = point.proceed();
return toret;
}
}
SleepClass.java
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