2012-05-25 23 views
11

Tôi cần một cách đơn giản để gọi một chức năng sau mỗi 60 phút. Tôi có thể làm cái này như thế nào? Tôi đang tạo plugin bukkit MineCraft và đây là những gì tôi có:Làm thế nào để gọi hàm mỗi giờ? Ngoài ra, làm thế nào tôi có thể lặp lại điều này?

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(); 
     } 
    } 
} 

Tôi cần chạy một hàm tôi sẽ thực hiện mỗi giờ, như thế nào? Ghi nhớ: Hàm sẽ sử dụng l1 và l2. Ngoài ra, làm thế nào tôi có thể vòng lặp này để có được mọi khối inbetween?

+0

Trước tiên, tôi muốn hỏi lý do tại sao bạn cần chạy hàm mỗi giờ và sử dụng hàm sự kiện onPlayerInteract để kích hoạt sự kiện dựa trên nhấp chuột trái hoặc phải. Điều này dường như mâu thuẫn với nhau. –

Trả lời

24

Tạo một đối tượng Timer và cung cấp cho nó một TimerTask mà thực hiện mã bạn muốn thực hiện.

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); 

Nếu bạn khai báo hourlyTask trong chức năng onPlayerInteract của bạn, sau đó bạn có thể truy cập l1l2. Để biên dịch, bạn cần phải đánh dấu cả hai dạng là final.

Ưu điểm của việc sử dụng một đối tượng Timer là nó có thể xử lý nhiều đối tượng TimerTask, đều có thời gian riêng của họ, chậm trễ, vv Bạn cũng có thể bắt đầu và ngừng các giờ miễn là bạn giữ cho các đối tượng bằng cách tuyên bố Timer nó như là một biến lớp hoặc một cái gì đó.

Tôi không biết cách chặn mọi khối ở giữa.

+0

Tôi vẫn không thể truy cập l1. –

+1

Tôi sẽ bỏ phiếu để sử dụng lớp Timer thay vì Thread, như những người khác có thể. Lý do là Timer sử dụng bộ đếm thời gian/đồng hồ hệ thống để kích hoạt cuộc gọi chức năng. Do đó thời gian phải chính xác càng nhiều càng tốt. Trong khi sử dụng các chủ đề sẽ phụ thuộc vào việc quản lý luồng Java và hệ điều hành, khá phức tạp để dự đoán. –

+0

@Plazmotech, Bạn sẽ phải thêm mã để truy cập đối tượng cục bộ l1 hoặc l2, xuất phát từ chức năng dựa trên sự kiện. Tôi sẽ để nó ở đó ngay bây giờ. –

2

Tạo chuỗi sẽ chạy vĩnh viễn và thức dậy mỗi giờ để thực thi dữ liệu của bạn.

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

Thannks! Lỗi cú pháp trên mã thông báo "t", VariableDeclaratorId được mong đợi sau mã thông báo này –

+0

Có, tôi quên thêm dấu chấm phẩy vào cuối khai báo 't'. Tôi đã thêm nó. –

1
  1. Cách đơn giản nhất (theo ý kiến ​​của tôi) là sử dụng Thread (nhận xét ở trên đã đề cập đến nó).
  2. Bạn cũng có thể sử dụng Timer trong javax.swing.Timer
  3. Nhưng tôi nghĩ - như 101100 đã nói - bạn có thể sử dụng TimerTask. Bạn có thể kiểm tra điều này link (từ IBM)
2

Bạn phải sử dụng Bukkit Scheduler:

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

Bạn phải tạo ra một phương pháp với điều này và ở đó bạn phải gọi phương thức tương tự.

+0

Khi máy chủ bị trễ <20tps, thời gian không còn chính xác nữa. –

Các vấn đề liên quan