2013-04-21 38 views
6

Tôi đang tạo một plugin bukkit cho bạn tôi, và tôi muốn tìm hiểu cách gọi một hàm mỗi 2 lần đánh dấu (1/10 giây).Cách thực hiện một chức năng được gọi là 2 dấu tích

+2

Tại sao downvote? Làm thế nào điều này ít hợp lệ hơn so với yêu cầu làm thế nào để sử dụng bất kỳ API khác? Bukkit thực sự là một api được xuất bản khá phổ biến, nếu không hợp lệ để hỏi về việc bạn nên bắt đầu các câu hỏi bỏ phiếu xuống về mọi API - MySQL, Hibernate ... –

+0

bản sao có thể có của [Java Loop mỗi phút] (http: //stackoverflow.com/questions/2702980/java-loop-every-minute) –

+3

@DavidZ Sử dụng 'BukkitAPI' cho điều này rất khác nhau, sau đó sử dụng nó chỉ với' Java'. Sử dụng 'Sleep' sẽ dừng toàn bộ máy chủ trong' x' giây, gây lag và nhiều vấn đề khác. – Jojodmo

Trả lời

14

Vâng, đây có thể không phải là nơi bạn muốn xem. Bạn nên sử dụng this cho bất kỳ nhu cầu phát triển nào của mình.
Dù bằng cách nào, tôi có thể trả lời câu hỏi của bạn. Bạn muốn sử dụng công cụ lên lịch được tích hợp sẵn. Bạn có thể truy cập nó bằng cách sử dụng

server.getScheduler(); 

Cụ thể, bạn sẽ muốn tạo Runnable và làm cho nó gọi phương thức của bạn cứ 2 lần.

int id = server.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { 
    public void run() { 
     myMethod(); 
    }, 0, 2); 

Tôi sẽ giải thích sự khác biệt với đồng bộ hóa và không đồng bộ trong giây, nhưng điều này sẽ thực hiện những gì bạn muốn. Đối số đầu tiên chỉ là tham chiếu đến plugin (Thông thường this hoặc plugin). Thứ hai là runnable, và rõ ràng bạn nên thay thế myMethod bằng phương thức bạn muốn gọi. Đối số thứ ba là số lượng độ trễ (Trong ve) cho đến khi phương thức đầu tiên chạy. Tôi giả định 0, nhưng nó cũng có thể là hai tùy thuộc vào những gì bạn muốn làm. Đối số cuối cùng là khoảng thời gian giữa các lần chạy mà bạn muốn là hai.
Bạn sẽ nhận thấy rằng phương pháp này trả về một số nguyên, mà bạn có thể sử dụng để hủy bỏ nhiệm vụ như vậy:

server.getScheduler().cancelTask(id); 

Điều quan trọng là để thảo luận về sự khác biệt giữa Async và Sync. Bạn sẽ nhận thấy phương pháp mà chúng tôi đã gọi ngay từ đầu cho biết lịch biểu Đồng bộ hóa RepeatingTask. Đồng bộ hóa có nghĩa là Runnable mà chúng tôi đã chỉ định làm đối số thứ hai sẽ được chạy trên luồng chính của máy chủ. BẤT CỨ phương pháp gọi phương thức Bukkit/CraftBukkit/Minecraft PHẢI được chạy dưới dạng đồng bộ. Nếu bạn chạy một cái gì đó mà nói, sửa đổi một khối, như Async bạn hoàn toàn có thể bị hỏng máy chủ. Chỉ cần không làm điều đó;) Async, mặt khác, tạo ra một chuỗi riêng biệt cho Runnable, được sử dụng cho các tác vụ nền, chẳng hạn như sao chép và dán một tệp hoặc kiểm tra thời gian của nó. Một lần nữa, KHÔNG BAO GIỜ chạy một phương pháp sẽ sửa đổi thế giới là Không đồng bộ.

Cuối cùng, trong tương lai nếu bạn chỉ muốn chạy một lần và sau đó không lặp lại, bạn chỉ có thể sử dụng phương thức int id = scheduleSyncDelayedTask(plugin, Runnable, 2), với hai đối số đầu tiên giống nhau và thứ ba là độ trễ cho đến khi chạy được được điều hành (Bọ ve)

Chúc may mắn,
Mẹo

+0

không sinh ra một thực thể cũng được tính theo phương pháp bukkit/craftbukkit/minecraft? hoặc tôi có thể chạy các loại lệnh này với ASync không? – xorinzor

+0

@xorinzor Bạn nên chạy đồng bộ hóa. –

+0

@ Tips48 bạn đang thiếu dấu ngoặc nhọn đóng sau 'myMethod();'. – Chad

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