programing

실행 가능한 인터페이스를 구현하여 생성 된 스레드를 중지하는 방법은 무엇입니까?

copyandpastes 2021. 1. 17. 12:30
반응형

실행 가능한 인터페이스를 구현하여 생성 된 스레드를 중지하는 방법은 무엇입니까?


실행 가능한 인터페이스를 구현하여 클래스를 만든 다음 프로젝트의 다른 클래스에서 많은 스레드 (거의 10 개)를 만들었습니다.
일부 스레드를 중지하는 방법은 무엇입니까?


간단한 방법이다 interrupt()일으킬 것이다, 그것을 Thread.currentThread().isInterrupted()반환 true하고,도를 던질 수 InterruptedException스레드입니다 특정 상황에서 기다리고 , 예를 들어 Thread.sleep(), otherThread.join(), object.wait()

run()메서드 내에서 해당 예외를 포착하고 / 또는 정기적으로 Thread.currentThread().isInterrupted()값을 확인하고 무언가를 수행해야합니다 (예 : 브레이크 아웃).

참고 : Thread.interrupted()와 동일 해 보이지만 isInterrupted()불쾌한 부작용이 있습니다. 호출 플래그를 interrupted() 지우는interrupted 반면 호출 isInterrupted()은 그렇지 않습니다.

다른 비 중단 방법은 volatile실행중인 스레드가 모니터링하는 "중지"( ) 플래그 사용을 포함합니다 .


실행 가능한 인터페이스를 구현하여 생성 된 스레드를 중지하는 방법은 무엇입니까?

스레드를 중지 할 수있는 방법은 여러 가지가 있지만 모두 특정 코드를 사용하여 중지합니다. 스레드를 중지하는 일반적인 방법은 스레드가 volatile boolean shutdown자주 확인 하는 필드 를 갖는 것 입니다.

  // set this to true to stop the thread
  volatile boolean shutdown = false;
  ...
  public void run() {
      while (!shutdown) {
          // continue processing
      }
  }

또한 원인이 스레드를 중단 할 수 있습니다 sleep(), wait()그리고 몇 가지 다른 방법 던져 InterruptedException. 또한 다음과 같이 스레드 인터럽트 플래그를 테스트해야합니다.

  public void run() {
      while (!Thread.currentThread().isInterrupted()) {
          // continue processing
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              // good practice
              Thread.currentThread().interrupt();
              return;
          }
      }
  }

와 스레드를 중단하는 것을주의 interrupt()할 것이다 없습니다 반드시 즉시 예외를 발생하는 원인이된다. 인터럽트 가능한 메서드에있는 경우에만 InterruptedExceptionthrow됩니다.

shutdown()를 구현하는 클래스에 메서드 를 추가 하려면 다음 Runnable과 같이 고유 한 클래스를 정의해야합니다.

public class MyRunnable implements Runnable {
    private volatile boolean shutdown;
    public void run() {
        while (!shutdown) {
            ...
        }
    }
    public void shutdown() {
        shutdown = true;
    }
}

중간에 스레드를 중지 하는 것은 좋은 습관이 아닙니다. 더 적절한 방법은 스레드가 프로그래밍 방식으로 반환되도록하는 것입니다. Runnable 개체가 run()메서드 에서 공유 변수를 사용하도록합니다 . 스레드가 중지되기를 원할 때마다 해당 변수를 플래그로 사용하십시오.

편집 : 샘플 코드

class MyThread implements Runnable{

    private Boolean stop = false;

    public void run(){

        while(!stop){

            //some business logic
        }
    }
    public Boolean getStop() {
        return stop;
    }

    public void setStop(Boolean stop) {
        this.stop = stop;
    }       
}

public class TestStop {

    public static void main(String[] args){

        MyThread myThread = new MyThread();
        Thread th = new Thread(myThread);
        th.start();

        //Some logic goes there to decide whether to 
        //stop the thread or not. 

        //This will compell the thread to stop
        myThread.setStop(true);
    }
}

If you use ThreadPoolExecutor, and you use submit() method, it will give you a Future back. You can call cancel() on the returned Future to stop your Runnable task.


Stopping (Killing) a thread mid-way is not recommended. The API is actually deprecated.

However,you can get more details including workarounds here: How do you kill a thread in Java?


Thread.currentThread().isInterrupted() is superbly working. but this code is only pause the timer.

This code is stop and reset the thread timer. h1 is handler name. This code is add on inside your button click listener. w_h =minutes w_m =milli sec i=counter

 i=0;
            w_h = 0;
            w_m = 0;


            textView.setText(String.format("%02d", w_h) + ":" + String.format("%02d", w_m));
                        hl.removeCallbacksAndMessages(null);
                        Thread.currentThread().isInterrupted();


                        }


                    });


                }`

ReferenceURL : https://stackoverflow.com/questions/10630737/how-to-stop-a-thread-created-by-implementing-runnable-interface

반응형