在java中是否有Thread.sleep的替代品

时间:2016-06-21 07:59:14

标签: java multithreading

这是我的代码

while (true) {
    try {
        Thread.sleep(5 * 60 * 1000);
        processData();// data processing job
    } catch (InterruptedException e) {
        SystemMessageBillPay.getInstance().writeMessage("ERROR: CEB.run() - " + e.getMessage());
    } catch (NumberFormatException e) {
        SystemMessageBillPay.getInstance().writeMessage("ERROR: CEB.run() - " + e.getMessage());
    }
}

到这个

  

" Thread.sleep(5 * 60 * 1000);"

代码检查员发出警告

  

"在循环中调用Thread.sleep会导致性能问题"

防止此警告的代码应该是什么

4 个答案:

答案 0 :(得分:1)

Is there a alternative to Thread.sleep

是的,有办法。的

看起来你想安排一些工作。您可以使用TimerTaskScheduledExecutorService代替此。所以后面的部分问题是关于

  

“在循环中调用Thread.sleep会导致性能问题”

这将通过安排任务来解决。

安排任务。

public class Test extends TimerTask{

public static void main(String[] args) {
  Test task = new Test();
  Timer timer = new Timer();
  Calendar today = Calendar.getInstance();
  today.set(Calendar.HOUR_OF_DAY, 13);
  today.set(Calendar.MINUTE, 47);
  today.set(Calendar.SECOND, 0);
  timer.schedule(task, today.getTime(), TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS));
}

 @Override
public void run() {
 System.out.println("Running Scheduled Task...!!!");
}
}

答案 1 :(得分:0)

您需要为此任务使用秒表计时器而不是线程。使用此:org.apache.commons.lang.time.StopWatch在此处描述:http://commons.apache.org/lang/

答案 2 :(得分:0)

或者你使用Quartz。这是一个外部图书馆:

http://www.quartz-scheduler.org/

答案 3 :(得分:0)

对于1.8,您还可以使用:

import java.util.concurrent.locks.LockSupport;

LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(1000));

根据Javadoc:

除非允许使用许可,否则在指定的等待时间内禁用用于线程调度目的的当前线程。