トップ 一覧 置換 検索 ヘルプ RSS ログイン

java でThreadのスリープと復帰の方法の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!wait と notiry を使う
{{code Java,
  private void cancel() {
      synchronized(this){
        isCancel = true;
       //止まっているスレッドを復帰させる
        this.notify();
      }
    }
    
    @Override
    public void run() {
      try {
        synchronized(this){
          // notify か 時間が来るまで待機
          this.wait(delay);
          if (isCancel){
            return;
          }
        }
        this.runnable.run();
      } catch (Exception e) {
      }
    }
  }
}}

!!sleep と interrupt を使う
{{code Java,
  private void cancel() {
      isCancel = true;
      //スレッドに割り込みを入れる
      interrupt();
    }
    
    @Override
    public void run() {
      try {
      //割り込まれるか時間が来るまで待機
        Thread.sleep(delay);
      } catch (Exception e){}

      if (!isCancel){
        this.runnable.run();
      }
    }
}}

!!カウントダウンタイマーのサンプル
!wait と notify を使う
{{code Java,
public class test {
  public static void main(String[] args){
    RunTimer timer = new RunTimer();
    Runnable run = new Runnable(){
      public void run(){
        System.out.println("run");
      }
    };
    
    timer.cancel();
    timer.start(run, 1000);
  }
}

class RunTimer {
  private LocalThread current;
  
  public void start(Runnable runnable, long delay) {
    current = new LocalThread(runnable, delay);
    current.start();
  }
  
  // 最後にstartした処理のみキャンセル可能
  public void cancel() {
    if (current != null) {
      current.cancel();
    }
  }
  
  private class LocalThread extends Thread {
    private Runnable runnable;
    private long delay;
    private boolean isCancel;
    
    private LocalThread(Runnable runnable, long delay) {
      this.runnable = runnable;
      this.delay = delay;
      this.isCancel = false;
    }
    
    private void cancel() {
      synchronized(this){
        isCancel = true;
        this.notify();
      }
    }
    
    @Override
    public void run() {
      try {
        synchronized(this){
          this.wait(delay);
          if (isCancel){
            return;
          }
        }
        this.runnable.run();
      } catch (Exception e) {
      }
    }
  }
}
}}

!!sleep と interrupt を使う
!sleep と interrupt を使う
{{code Java,

public class test {
  public static void main(String[] args){
    RunTimer timer = new RunTimer();
    Runnable run = new Runnable(){
      public void run(){
        System.out.println("run");
      }
    };
    
    timer.cancel();
    timer.start(run, 1000);
  }
}

class RunTimer {
  private LocalThread current;
  
  public void start(Runnable runnable, long delay) {
    current = new LocalThread(runnable, delay);
    current.start();
  }
  
  // 最後にstartした処理のみキャンセル可能
  public void cancel() {
    if (current != null) {
      current.cancel();
    }
  }
  
  private class LocalThread extends Thread {
    private Runnable runnable;
    private long delay;
    private boolean isCancel;
    
    private LocalThread(Runnable runnable, long delay) {
      this.runnable = runnable;
      this.delay = delay;
      this.isCancel = false;
    }
    
    private void cancel() {
      isCancel = true;
      interrupt();
    }
    
    @Override
    public void run() {
      try {
        Thread.sleep(delay);
      } catch (Exception e){}
      
      if (!isCancel){
        this.runnable.run();
      }
    }
  }
}
}}
{{category2 プログラミング言語,Java}}