CodeGym/Java Blog/무작위의/멀티스레딩: Thread 클래스의 메서드가 수행하는 작업
John Squirrels
레벨 41
San Francisco

멀티스레딩: Thread 클래스의 메서드가 수행하는 작업

무작위의 그룹에 게시되었습니다
회원
안녕! 오늘 우리는 계속해서 멀티스레딩에 대해 이야기할 것입니다. Thread 클래스와 이 클래스의 몇 가지 메서드가 수행하는 작업을 살펴보겠습니다. 이전에 클래스 메서드를 연구할 때 일반적으로 <메소드 이름> -> <메소드가 수행하는 작업>으로 작성했습니다. 멀티스레딩: Thread 클래스의 메서드가 수행하는 작업 - 1이것은 의 메소드와 함께 작동하지 않습니다 Thread:) 그들은 몇 가지 예 없이는 알아낼 수 없는 더 복잡한 논리를 가지고 있습니다.

Thread.start() 메서드

반복해서 시작합시다. 기억하시겠지만 클래스가 클래스를 상속 Thread하고 run()메서드를 재정의하여 스레드를 만들 수 있습니다. 그러나 물론 자체적으로 시작되지는 않습니다. 이를 위해 객체의 start()메서드를 호출합니다. 멀티스레딩: Thread 클래스의 메서드가 수행하는 작업 - 2이전 수업의 예를 상기해 보겠습니다.
public class MyFirstThread extends Thread {

   @Override
   public void run() {
       System.out.println("Thread executed: " + getName());
   }
}


public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.start();
       }
   }
}
참고: 스레드를 시작하려면start()가 아닌 특수 메서드를run()! 이는 특히 멀티스레딩을 처음 공부할 때 범하기 쉬운 오류입니다. 이 예에서 대신 메서드를 10번 호출하면run()과 같은start()결과가 나타납니다.
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.run();
       }
   }
}
프로그램의 결과를 보십시오: 실행된 스레드: Thread-0 실행된 스레드: Thread-1 실행된 스레드: Thread-2 실행된 스레드: Thread-3 실행된 스레드: Thread-4 실행된 스레드: Thread-5 실행된 스레드: Thread-6 실행된 스레드: Thread-7 실행된 스레드: Thread-8 실행된 ​​스레드: Thread-9 출력 순서를 살펴보십시오. 모든 것이 완벽한 순서로 발생합니다. 이상해? 스레드가 시작되고 실행되는 순서는 운영 체제 내부의 우수한 지능인 스레드 스케줄러에 의해 결정된다는 것을 이미 알고 있기 때문에 우리는 이에 익숙하지 않습니다. 어쩌면 우리는 운이 좋았을까요? 물론 이것은 운에 관한 것이 아닙니다. 프로그램을 몇 번 더 실행하여 이를 확인할 수 있습니다. 문제는run()메소드는 멀티스레딩과 직접적인 관련이 없습니다. 이 경우 프로그램은 메서드를 실행하는 동일한 스레드인 기본 스레드에서 실행됩니다 main(). 콘솔에 10줄을 연속적으로 인쇄하면 됩니다. 10개의 스레드가 시작되지 않았습니다. 그러니 앞으로 이것을 기억하고 끊임없이 자신을 점검하십시오. run()메소드를 호출하려면 를 호출 하십시오 start(). 더 가자.

Thread.sleep() 메서드

현재 스레드의 실행을 잠시 중단하려면 이 sleep()메서드를 사용합니다. 다중 스레딩: Thread 클래스의 메서드가 수행하는 작업 - 3sleep()메서드는 스레드를 절전 모드로 전환하는 데 걸리는 시간을 나타내는 인수로 밀리초를 사용합니다.
public class Main {

   public static void main(String[] args) throws InterruptedException {

       long start = System.currentTimeMillis();

       Thread.sleep(3000);

       System.out.println(" - How long did I sleep? \n - " + ((System.currentTimeMillis()-start)) / 1000 + " seconds");

   }
}
콘솔 출력: - 얼마나 오래 잤습니까? - 3초 참고: 메서드 sleep()는 정적입니다. 현재 스레드를 잠자기 상태로 만듭니다. 즉, 현재 실행 중인 것입니다. 여기에 또 다른 중요한 점이 있습니다. 잠자는 스레드는 중단될 수 있습니다. 이 경우 프로그램은 InterruptedException. 아래에서 예를 살펴보겠습니다. 그런데 스레드가 깨어난 후에는 어떻게 됩니까? 중단된 위치에서 바로 계속 실행됩니까? 아니요. 스레드가 깨어난 후, 즉 인수로 전달된 시간이 지나면 실행 가능 상태Thread.sleep() 로 전환됩니다.상태. 그러나 이것이 스레드 스케줄러가 실행한다는 의미는 아닙니다. 잠자지 않는 다른 스레드에 우선권을 부여하고 새로 깨어난 스레드가 나중에 작업을 계속하도록 허용할 수 있습니다. 이것을 기억하세요: 잠에서 깬다고 해서 즉시 작업을 계속하는 것은 아닙니다!

Thread.join() 메소드

멀티스레딩: Thread 클래스의 메서드가 수행하는 작업 - 4join()메서드는 다른 스레드가 완료될 때까지 현재 스레드의 실행을 일시 중단합니다. 스레드가 2개이고 , t1다음 t2을 작성하는 경우
t1.join()
작업이 완료될 때 까지 t2시작되지 않습니다 . t1join()메서드는 스레드의 실행 순서를 보장하는 데 사용할 수 있습니다. join()다음 예에서 메서드가 어떻게 작동하는지 살펴보겠습니다 .
public class ThreadExample extends Thread {

   @Override
   public void run() {

       System.out.println("Thread started: " + getName());

       try {
           Thread.sleep(5000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       System.out.println("Thread " + getName() + " is finished.");
   }
}


public class Main {

   public static void main(String[] args) throws InterruptedException {

       ThreadExample t1 = new ThreadExample();
       ThreadExample t2 = new ThreadExample();

       t1.start();


 /* The second thread (t2) will start running only after the first thread (t1)
       is finished (or an exception is thrown) */
       try {
           t1.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       t2.start();

       // The main thread will continue running only after t1 and t2 have finished
       try {
           t1.join();
           t2.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       System.out.println("All threads have finished. The program is finished.");

   }
}
간단한 ThreadExample클래스를 만들었습니다. 그 작업은 스레드가 시작되었다는 메시지를 표시하고 5초 동안 잠들고 마지막으로 작업이 완료되었음을 보고하는 것입니다. 케이크 조각. 주요 논리는 Main클래스에 있습니다. 주석을 보십시오: 우리는 join()스레드의 실행 순서를 성공적으로 관리하기 위해 메소드를 사용합니다. 이 주제를 어떻게 시작했는지 기억한다면 실행 순서는 스레드 스케줄러에 의해 처리됩니다. 자체 재량에 따라 매번 다른 방식으로 스레드를 실행합니다. 여기서 우리는 스레드가 t1먼저 시작되고 먼저 실행된 다음t2그 후에야 프로그램의 메인 스레드가 계속됩니다. 계속. 실제 프로그램에서는 스레드 실행을 중단해야 하는 상황을 자주 볼 수 있습니다. 예를 들어 스레드가 실행 중이지만 특정 이벤트나 조건을 기다리고 있습니다. 발생하면 스레드가 중지됩니다. 어떤 종류의 방법이 있다면 아마 이치에 맞을 것입니다 stop(). 그러나 그렇게 간단하지 않습니다. 옛날 옛적에 Java에는 실제로 Thread.stop()메서드가 있었고 스레드가 중단되도록 허용했습니다. 그러나 나중에 Java 라이브러리에서 제거되었습니다. Oracle 설명서에서 찾을 수 있으며 더 이상 사용되지 않는 것으로 표시되어 있음을 확인할 수 있습니다.. 왜? 다른 작업을 수행하지 않고 스레드를 중지했기 때문입니다. 예를 들어 스레드가 데이터로 작업하고 무언가를 변경하고 있을 수 있습니다. 그런 다음 작업 도중에 갑자기 그리고 무례하게 stop()방법에 의해 차단되었습니다. 적절한 종료도, 리소스 해제도, 오류 처리도 없이는 이런 일이 없었습니다. 약간 과장하자면, 이 stop()방법은 단순히 방해가 되는 모든 것을 파괴했습니다. 컴퓨터를 끄기 위해 콘센트에서 전원 코드를 뽑는 것과 같았습니다. 예, 원하는 결과를 얻을 수 있습니다. 하지만 몇 주 후에는 컴퓨터가 그런 식으로 처리한 것에 대해 감사하지 않을 것임을 모두가 알고 있습니다. 그렇기 때문에 스레드 중단 논리가 Java에서 변경되어 이제 특수한 interrupt()방법을 사용합니다.

Thread.interrupt() 메서드

interrupt()메서드가 스레드에서 호출 되면 어떻게 됩니까 ? 두 가지 가능성이 있습니다.
  1. join예를 들어 또는 메서드 로 인해 개체가 대기 상태에 있으면 sleep대기가 중단되고 프로그램에서 InterruptedException.
  2. 스레드가 작동 상태에 있으면 부울 interrupted플래그가 개체에 설정됩니다.
하지만 우리는 객체에서 이 플래그의 값을 확인하고 우리 스스로 작업을 올바르게 완료해야 합니다! Thread이것이 클래스에 메서드가 있는 이유입니다 boolean isInterrupted(). 기본 과정의 수업에 있었던 시계 예제로 돌아가 봅시다. 편의상 약간 단순화했습니다.
public class Clock extends Thread {

   public static void main(String[] args) throws InterruptedException {
       Clock clock = new Clock();
       clock.start();

       Thread.sleep(10000);
       clock.interrupt();
   }

   public void run() {
       Thread current = Thread.currentThread();

       while (!current.isInterrupted())
       {
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               System.out.println("The thread was interrupted");
               break;
           }
           System.out.println("Tick");
       }
   }
}
이 경우 시계가 시작되고 매초마다 똑딱거리기 시작합니다. 10초에 시계의 스레드를 중단합니다. 이미 알고 있듯이 중단하려는 스레드가 대기 상태 중 하나인 경우 결과는 InterruptedException. 이것은 검사된 예외이므로 쉽게 포착하고 논리를 실행하여 프로그램을 완료할 수 있습니다. 그리고 그것이 바로 우리가 한 일입니다. 결과는 다음과 같습니다. Tick Tick Tick Tcik Tick Tick Tick Tick 스레드가 중단되었습니다. 이것으로 Thread클래스의 가장 중요한 메서드에 대한 소개를 마칩니다. 행운을 빌어요!
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다