如何每小时调用一次函数?另外,我怎样才能循环这个?

Posted

技术标签:

【中文标题】如何每小时调用一次函数?另外,我怎样才能循环这个?【英文标题】:How to call function every hour? Also, how can I loop this? 【发布时间】:2012-05-31 16:04:49 【问题描述】:

我需要一种简单的方法来每 60 分钟调用一次函数。我怎样才能做到这一点?我正在制作一个 MineCraft bukkit 插件,这就是我所拥有的:

package com.webs.playsoulcraft.plazmotech.java.MineRegen;

import java.util.logging.Logger;

import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin

    public final Logger log = Logger.getLogger("Minecraft");


    @Override
    public void onEnable() 
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        this.log.info("Plaz's Mine Regen is now enabled!");
        this.log.info("Copyright 2012 Plazmotech Co. All rights reserved.");
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    

    @Override 
    public void onDisable() 
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        this.log.info("Plaz's Mine Regen is now disabled!");
        this.log.info("Copyright 2012 Plazmotech Co. All rights reserved.");
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    

    public void onPlayerInteract(PlayerInteractEvent event) 
        final Action action = event.getAction();
        if (action == Action.LEFT_CLICK_BLOCK) 
            Location l1 = event.getClickedBlock().getLocation();
         else if (action == Action.RIGHT_CLICK_BLOCK) 
            Location l2 = event.getClickedBlock().getLocation();
        
    

我需要运行一个我将每小时执行一次的函数,怎么做?请记住:该函数将使用 l1 和 l2。另外,我怎样才能循环这个以获取中间的每个块?

【问题讨论】:

首先我想问一下为什么需要每小时运行一个函数,并使用事件函数onPlayerInteract来触发一个基于左键或右键的事件。这似乎相互矛盾。 【参考方案1】:

创建一个Timer 对象并给它一个TimerTask 来执行您想要执行的代码。

Timer timer = new Timer ();
TimerTask hourlyTask = new TimerTask () 
    @Override
    public void run () 
        // your code here...
    
;

// schedule the task to run starting now and then every hour...
timer.schedule (hourlyTask, 0l, 1000*60*60);

如果您在onPlayerInteract 函数中声明hourlyTask,则可以访问l1l2。要进行编译,您需要将它们都标记为final

使用Timer 对象的好处是它可以处理多个TimerTask 对象,每个对象都有自己的计时、延迟等。您还可以启动和停止计时器,只要您按住@ 987654331@对象,通过将其声明为类变量或其他东西。

我不知道如何获取中间的每个块。

【讨论】:

我会像其他人一样投票使用 Timer 类而不是 Thread。原因是 Timer 使用系统定时器/时钟来触发函数调用。因此,时间应尽可能准确。而使用线程将取决于 Java 线程管理和操作系统,预测起来相当复杂。 @Plazmotech,您必须添加代码来访问来自基于事件的函数的本地对象 l1 或 l2。我暂时就这样吧。【参考方案2】:

创建一个将永远运行并每小时唤醒以执行数据的线程。

Thread t = new Thread() 
    @Override
    public void run() 
        while(true) 
            try 
                Thread.sleep(1000*60*60);
                //your code here...
             catch (InterruptedException ie) 
            
        
    
;
t.start();

【讨论】:

谢谢!标记“t”的语法错误,此标记后应为 VariableDeclaratorId 是的,我忘了在t 声明的末尾添加分号。我已经添加了。 Thread.sleep 在使用 Bukkit 或 Spigot 时不起作用。服务器将冻结。【参考方案3】:

你必须使用 Bukkit 调度器:

public void Method()
    this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() 
        @Override
        public void run() 
            // Your code goes here
            Method();
        
    , time * 20L );

你必须用这个创建一个方法,并且在那里你必须调用相同的方法。

【讨论】:

服务器滞后 【参考方案4】:
    最简单的方法(在我看来)是使用Thread(上面的评论有提及)。 你也可以在javax.swing.Timer中使用Timer 但我认为——正如 101100 所说——你可以使用TimerTask。您可以查看link(来自 IBM)

【讨论】:

Thread.sleep 将无法使用 Bukkit/Spigot。这将导致服务器崩溃。

以上是关于如何每小时调用一次函数?另外,我怎样才能循环这个?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode怎样查看数组中每一个数的值?

如何从 python 脚本在新窗口上打开批处理

我怎样才能重新调用这个函数?没有经验的ES6

objective-c 中如何在一个函数中调用自己类中的另外一个函数

我怎样才能用jquery做一个循环?

如何在单击剑道网格每一行时调用单个函数