在java中停止执行几秒钟的最佳方法是什么?

时间:2014-01-03 09:55:52

标签: java multithreading thread-sleep

我是Java新手。我试着写一个程序来检查数据库状态(是否重载)。

CODE:

package com.test.service;

import java.util.LinkedList;
import java.util.List;

public class PersonImpl {

    public PersonService personService;

    public void InsertPersonDetails(Person person) {

        if(personService.isOverLoaded()) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } else {
            //pass control to dao
        }
    }
}

我将从boolean获取isOverLoaded。如果isOverLoaded值为yes,那么我们应该停止将控制权传递给dao几秒钟,然后再次检查isOverLoaded方法。

帮助将不胜感激:)

4 个答案:

答案 0 :(得分:3)

我会选择ScheduledExecutorService。创建一个线程,只要isOverloaded()返回true,就重新安排执行。

答案 1 :(得分:3)

您的代码看起来很好用。

if(personService.isOverLoaded())
{
    try {
          Thread.sleep(5000);  
          //Any other code to execute after 5 min execution pause.
    } catch (InterruptedException e) {
          e.printStackTrace();
    }
}else{
    //pass control to dao
}

Thread.sleep(5000)暂停执行5秒钟并再次恢复。如果你在这个语句之后有任何代码,那么它将在5秒暂停后执行,如果不是,它将执行if / else完成后写的代码。

如果要继续检查数据库过载状态,则需要在每5秒后继续执行函数personService.isOverLoaded()以检查数据库状态。

例如:

while(personService.isOverLoaded())
{
    try {
          Thread.sleep(5000);  
          //Any other code to execute after 5 min execution pause.
    } catch (InterruptedException e) {
          e.printStackTrace();
    }
}  

//pass control to dao

答案 2 :(得分:2)

您的代码看起来不错,应该可以使用。但您需要确保boolean传递的personService.isOverLoaded()值为volatile

Volatile将确保您的处理线程不会缓存此boolean标志的值。

   private volatile boolean flag = false;

    public void overLoaded(){
       flag = true; // based on some condition
    }

    public boolean isOverLoaded(){
        return flag; // Accessed in your thread
    }

答案 3 :(得分:2)

作为替代方案,您可以使用java.util.concurrent.BlockingQueue来控制流。您可以在一个线程中启动dao作为队列的使用者。然后,您的InsertPersonDetails方法将从主线程推送到队列。

我是否还可以指出java中通常使用小写字母启动方法,因此您的方法将是

public void insertPersonDetails(Person person)