Java-Thread의 시작 및 실행 메소드의 차이점

1. Thread의 start ()와 run ()을 알아라

1。start () :

API에 도입 된 메소드를 살펴 보겠습니다
. 실행할 스레드를 시작하고 Java 가상 머신이 스레드의 실행 메소드를 호출합니다.
결과는 동시에 실행되는 두 개의 스레드, 즉 현재 스레드 (호출에서 start 메소드로 복귀)와 다른 스레드 (실행 메소드 실행)입니다.
스레드를 여러 번 시작하는 것은 불법입니다. 특히 스레드 실행이 완료되면 다시 시작할 수 없습니다. 멀티 스레드 동작을 진정으로 구현하는 스레드를 시작하려면 start 메서드를 사용합니다. 이때 run 메서드 본문 코드의 실행이 완료 될 때까지 기다릴 필요가 없으며 다음 코드를 직접 계속 실행할 필요가 없습니다. Thread 클래스의 start () 메서드를 호출하여 스레드를 시작합니다. 이때 스레드는 준비 (실행 가능) 상태이며 실행 중이 아닙니다. cpu 타임 슬라이스를 획득하면 run () 메서드가 시작됩니다. run () 메소드가 호출되는 곳 실행될 쓰레드의 내용을 담고있는 쓰레드 바디이며, Run 메소드가 종료되면 쓰레드는 즉시 종료된다.

2。run () :

먼저 API에서이 메서드의 도입을 살펴 보겠습니다
. 스레드가 독립적 인 Runnable 개체를 사용하여 생성 된 경우 Runnable 개체의 run 메서드를 호출하고 그렇지 않으면 메서드가 아무 작업도 수행하지 않고 반환합니다.
Thread의 하위 클래스는이 메서드를 재정의해야합니다. run () 메서드는 클래스의 일반적인 메서드 일뿐입니다. Run 메서드를 직접 호출하면 프로그램에는 여전히 주 스레드 만 있고 프로그램 실행 경로는 여전히 하나만 있습니다. 순차적으로 실행해야합니다. 실행 메소드 본문이 실행 된 후 기다려야하며 스레드 작성 목적을 달성하지 못하도록 다음 코드를 계속 실행할 수 있습니다.

삼. 요약하자면 :

스레드는 start 메서드를 호출해야만 시작할 수 있으며 run 메서드는 스레드의 일반적인 메서드 호출이며 주 스레드에서 실행됩니다.

둘째, 코드 예 :

public static void main(String args[]) {
    
            
   	Thread t = new Thread() {
    
               
		 public void run() {
    
                   
  				pong();            
  		 }       
  	 };      
   	 t.start();       
     System.out.print("ping");   
}     
static void pong() {
    
           
      System.out.print("pong");   
}
 输出结果: pingpong  
public static void main(String args[]) {
    
    
        Thread t = new Thread() {
    
    
             public void run() {
    
    
                  pong();
             }
        };
       t.run();       
       System.out.print("ping");  
}     
static void pong() {
    
       
      System.out.print("pong");  
}
输出结果:pongping 

위의 두 프로그램 예제를 통해 start () 메서드와 run () 메서드의 차이점을 쉽게 구분할 수 있습니다.
t.start ();이 코드 줄은 스레드를 시작하는 것과 동일합니다. t.run (); 코드 줄은 t 클래스에서 run 메서드 사용과 동일합니다.

세, 스레드 상태 설명 :

스레드 상태는 초기 상태, 실행 가능 상태, 실행 불가능 상태, 데드 상태로 요약 할 수 있으며, 위 그림과 같이 7 가지 상태로 세분화 할 수 있으며 다음과 같이 설명됩니다.
1) 다음과 같은 두 가지 구현이 있습니다. 한 가지 방법은 Thread 클래스를 상속하는 것이고 다른 하나는 Runnable 인터페이스를 구현하는 것이지만 어쨌든 스레드 인스턴스를 새로 만들면 스레드가 초기 상태로 들어갑니다
.2) 객체가 start ()를 호출 할 때 메소드를 실행하면 실행 가능 상태가됩니다
.3) 실행 가능 상태에 진입 한 후 운영 체제에서 개체를 선택하면 CPU 시간 조각을 얻을 때 실행 상태로 들어갑니다
.4) 실행 상태에 들어간 후 대략 다음과 같이 더 많은 경우입니다.

  • run () 메서드 또는 main () 메서드가 종료 된 후 스레드는 종료 상태로 들어갑니다.
  • 스레드가 자체 sleep () 메서드 또는 다른 스레드의 join () 메서드를 호출하면 차단 상태가됩니다 (이 상태는 현재 스레드를 중지하지만 소유 한 리소스를 해제하지는 않습니다).
  • sleep ()이 종료되거나 join ()이 종료되면 스레드는 실행 가능 상태가되고 OS가 시간 조각을 할당 할 때까지 계속 기다립니다.
  • 스레드가 실행 가능 상태 (실행 중이 아님)에 들어가고 호출 할 리소스가 잠겨 있음 (synchroniza, lock)을 발견하면 즉시 잠금 풀 상태로 들어가 잠금 표시를 획득하기를 기다립니다 (이 때 시간, 잠금 풀은 잠금 표시를 획득하기 위해 대기중인 다른 스레드와 함께이 시점에 대기열 상태에 있으며, 이는 선착순으로 제공됩니다.) 스레드가 잠금 표시를 획득하면 실행 가능한 상태로 바뀝니다. OS가 CPU 타임 슬라이스를 할당 할 때까지 기다립니다.
  • 스레드가 wait () 메서드를 호출하면 대기 대기열에 들어갑니다 (이 상태에 들어가면 차단 상태와 다른 점유 된 모든 리소스가 해제 됨).이 상태에 들어간 후에는 자동으로 깨어날 수 없습니다. 의존해야합니다. 다른 스레드에서 notify () 또는 notifyAll () 메서드를 호출 할 때만 깨울 수 있습니다 (notify ()는 스레드를 깨우기 만하기 때문입니다.하지만 어떤 스레드가 구체적으로 깨어 났는지 확실하지 않습니다. 깨어나야하는 스레드가 깨어나지 못할 수도 있습니다. 깨어나므로 실제 사용에서는 일반적으로 notifyAll () 메서드를 사용하여 일부 스레드를 깨 웁니다.) 스레드가 깨어 난 후에는 잠금 풀에 들어가 잠금 표시가 획득 될 때까지 기다립니다. 쓰레드가 stop 메소드를 호출하면 쓰레드는 dead state가 될 수 있지만 stop 메소드가 안전하지 않기 때문에 사용하지 않는 것이 좋으며 run 메소드에서 조건을 변경하여 쓰레드 정지를 구현할 수있다.

추천

출처blog.csdn.net/qq_47768542/article/details/109702664