수색…


통사론

  • Bukkit.getScheduler().scheduleSyncRepeatingTask(Plugin plugin, Runnable task, int initialDelay, int repeatingDelay)
  • Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin plugin, Runnable task, int initialDelay)
  • Bukkit.getScheduler().runTaskAsynchronously(Plugin plugin, Runnable task)
  • Bukkit.getScheduler().runTask(Plugin plugin, Runnable task)
  • new BukkitRunnable() { @Override public void run() { /* CODE */ } }.runTaskLater(Plugin plugin, long delay);
  • new BukkitRunnable() { @Override public void run() { /* CODE */ } }.runTaskTimer(Plugin plugin, long initialDelay, long repeatingDelay);

비고

일부 Bukkit API 메소드는 스레드로부터 안전하며 비동기 적으로 호출 할 수 있습니다. 이러한 이유로, Bukkit API 메소드는, 몇 가지 예외를 제외하고는 주 스레드에서 실행해야합니다.

scheduleSync 메서드 내에서 실행되는 코드와 runTask 메서드는 주 스레드에서 실행됩니다.

runTaskAsynchronously 내부에서 실행되는 코드는 주 스레드에서 비동기 적으로 실행됩니다. 비동기 메서드는 서버에 뒤처지지 않고 큰 수학 연산이나 데이터베이스 연산을 수행하는 데 매우 유용하지만 Bukkit API 메서드를 호출하는 데 사용되는 경우 정의되지 않은 동작이 발생합니다. 이러한 이유 때문에 비동기 코드 뒤에 실행해야하는 Bukkit API 메소드는 항상 runTask 메소드에 있어야합니다.

스케줄러 반복 작업

스케줄러 작업 시간은 Ticks로 측정됩니다. 정상적인 조건에서는 초당 20 틱이 있습니다.

.scheduleSyncRepeatingTask 예약 된 작업은 주 스레드에서 실행됩니다

Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
    @Override
    public void run() {
        Bukkit.broadcastMessage("This message is shown immediately and then repeated every second");
    }
}, 0L, 20L); //0 Tick initial delay, 20 Tick (1 Second) between repeats

스케줄러 지연된 작업

스케줄러 작업 시간은 Ticks로 측정됩니다. 정상적인 조건에서는 초당 20 틱이 있습니다.

.scheduleSyncDelayedTask 예약 된 작업은 주 스레드에서 실행됩니다.

Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
    @Override
    public void run() {
        Bukkit.broadcastMessage("This message is shown after one second");
    }
}, 20L); //20 Tick (1 Second) delay before run() is called

작업을 비동기 적으로 실행

runTaskAsynchronously 사용하여 주 스레드에서 비동기 적으로 코드를 실행할 수 있습니다. 이는 메인 쓰레드가 멈추거나 (그리고 서버가 뒤처지는 것을) 막을 수 있기 때문에 집중적 인 수학이나 데이터베이스 연산을 할 때 유용합니다.

일부 Bukkit API 메소드는 스레드로부터 안전하기 때문에 주 스레드에서 비동기 적으로 호출되면 정의되지 않은 동작이 발생합니다.

Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
    @Override
    public void run() {
        Bukkit.getLogger().info("This message was printed to the console asynchronously");
        //Bukkit.broadcastMessage is not thread-safe
    }
});

주 스레드에서 작업 실행

runTask 사용하여 주 스레드와 동시에 코드를 실행할 수도 있습니다. 이는 주 스레드에서 코드를 비동기 적으로 실행 한 후 Bukkit API 메소드를 호출 할 때 유용합니다.

이 Runnable 내부에서 호출되는 코드는 주 스레드에서 실행되므로 Bukkit API 메소드를 호출하는 것이 안전합니다.

Bukkit.getScheduler().runTask(plugin, new Runnable() {
    @Override
    public void run() {
        Bukkit.broadcastMessage("This message is displayed to the server on the main thread");
        //Bukkit.broadcastMessage is thread-safe
    }
});

BukkitRunnable 실행하기

BukkitRunnable은 Bukkit에서 찾을 수있는 Runnable입니다. BukkitRunnable에서 직접 작업을 예약하고 내부에서 취소 할 수도 있습니다.

중요 : 작업 시간은 Ticks로 측정됩니다. 두 번째에는 20 틱이 있습니다.

비 RepeatingTask :

JavaPlugin plugin;    //Your plugin instance    
Long timeInSeconds = 10;
Long timeInTicks = 20 * timeInSeconds;
new BukkitRunnable() {
        
    @Override
    public void run() {
        //The code inside will be executed in {timeInTicks} ticks.
        
    }
}.runTaskLater(plugin, timeInTicks);   // Your plugin instance, the time to be delayed.

반복 작업 :

JavaPlugin plugin;    //Your plugin instance    
Long timeInSeconds = 10;
Long timeInTicks = 20 * timeInSeconds;
new BukkitRunnable() {
        
    @Override
    public void run() {
        //The code inside will be executed in {timeInTicks} ticks.
       //After that, it'll be re-executed every {timeInTicks} ticks;
      //Task can also cancel itself from running, if you want to.

       if (boolean) {
           this.cancel();
       }
        
    }
}.runTaskTimer(plugin, timeInTicks, timeInTicks);   //Your plugin instance, 
                                                   //the time to wait until first execution,
                                                  //the time inbetween executions.

비동기 작업에서 스레드 안전 코드 실행

비동기 작업에서 동기 코드를 실행해야하는 경우가 있습니다. 이렇게하려면 비동기식 블록에서 동기식 작업을 예약하십시오.

Bukkit.getScheduler().runTaskTimerAsynchronously(VoidFlame.getPlugin(), () -> {

    Bukkit.getScheduler().runTask(VoidFlame.getPlugin(), () -> {
        World world = Bukkit.getWorld("world");
        world.spawnEntity(new Location(world, 0, 100, 0), EntityType.PRIMED_TNT);
    });

}, 0L, 20L);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow