Java в то время как функция только 1 секунда - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть функция while.Когда это правда, я хочу продолжать это только каждую 1 секунду.Я не могу использовать Thread.sleep(), потому что я делаю плагин для Minecraft, и он остановит все процессы на сервере.Есть ли другой способ, как это сделать?

Спасибо за ваш ответ.

Ответы [ 5 ]

0 голосов
/ 27 февраля 2019

Если вы используете Thread.sleep() в основном Thread, вы заблокируете main thread, и во избежание этого вам нужно создать отдельный проход потока, тогда значения, которые вам понадобятся для обработки того, что вы хотите в своем потоке,некоторый фрагмент кода для уточнения:

public static boolean ENABLE_THREAD = true;

public static void main(String args[]){
    InnerThread minecraftThread = (new ThreadStack()).new InnerThread();
    minecraftThread.run();
}


public class InnerThread implements Runnable{
    @Override
    public void run() {
        int counter=0;
        while(ENABLE_THREAD){
            try {
                //YOUR CODE
                System.out.println(counter);
                Thread.sleep(1000);
                counter++;
                if(counter>10){
                    ENABLE_THREAD = false;
                }

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
0 голосов
/ 27 февраля 2019

Вы можете использовать System.currentTimeMillis():

public static void main(String[] args) {

    //The while(true) is to keep the next while loop running, otherwise, in 
    //this example, the condition System.currentTimeMillis()-past>=1000 
    //won't be true
    //It can be changed according to the needs

    long past = System.currentTimeMillis();
    while(true)
    while(System.currentTimeMillis()-past>=1000) 
    {
        /*
         *DO what you need to do     
         */
        past = System.currentTimeMillis();
    }
}
0 голосов
/ 27 февраля 2019

То, что вы ищете, это Bukkit Scheduler.Он интегрирован в API плагина по умолчанию и может быть использован для решения вашей задачи следующим образом:

int taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
    @Override
    public void run() {
        // do stuff
    }
}, delay, repeat);

Установите delay на 0 и повторите на 20 (20 тиков - 1 секунда).

Остановите, используя:

Bukkit.getScheduler().cancelTask(taskID);
0 голосов
/ 27 февраля 2019

Это самое простое решение, которое я могу придумать.Пожалуйста, проверьте, работает ли он для вас.

long start = new Date().getTime();

    while(new Date().getTime() - start < 1000L)
    {
    //Do Something every 1sec
    //you need to update the start value everytime
    start = new Date().getTime();
    }
0 голосов
/ 27 февраля 2019

вы можете создать java.util.TimerTask, который может планировать вашу задачу после указанной задержки.подробнее здесь: https://www.geeksforgeeks.org/java-util-timertask-class-java/

...