Java 프로그래밍에서 루트의 생성과 수호 루트를 간단히 이해하기

5612 단어 Java라인
라인의 두 가지 창설 방식과 우열 비교
1. Runnable 인터페이스 스레드 생성
(1).클래스를 정의하여 Runnable 인터페이스를 실현하고 인터페이스의 run () 방법을 다시 씁니다.run () 방법에 구체적인 작업 코드나 처리 논리를 추가합니다.
(2).Runnable 인터페이스 구현 클래스의 대상을 만듭니다.
(3).Thread 클래스의 대상을 만듭니다. 앞에 있는 Runnable 인터페이스 구현 클래스의 대상을 봉인해야 합니다.(인터페이스는 다중 계승을 실현할 수 있다)
(4).Thread 객체의 start() 메서드를 호출하여 스레드를 시작합니다.
예제 코드:

package demo.thread; 
 
public class TreadDemo1 implements Runnable { 
  private int countDown = 10; 
  @Override 
  //  run  
  public void run() { 
    while (countDown-- > 0) { 
      System.out.println("#" + Thread.currentThread().getName() + "(" 
          + countDown + ")"); 
    } 
  } 
 
  public static void main(String[] args) { 
    // Runnable run , ,  
    TreadDemo1 tt=new TreadDemo1(); 
    new Thread(tt).start(); 
    new Thread(tt).start(); 
    System.out.println(" :"); 
  } 
} 
실행 결과:
로켓 발사 전 카운트다운:

#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)
#Thread-0(9)
2. Thread 클래스를 계승하여 스레드 생성
(1).우선 클래스를 정의하여Thread 부류를 계승하고 부류의run() 방법을 다시 씁니다.run () 방법에 구체적인 작업 코드나 처리 논리를 추가합니다.
(2).ThreadDemo2 클래스의 객체를 직접 만들거나 변수가 상위 클래스의 유형으로 선언되는 다태성을 사용할 수 있습니다.
(3).start 방법, 스레드 t 시작, 은밀한 run () 방법을 호출합니다.
예제 코드:

package demo.thread; 
 
public class ThreadDemo2 extends Thread { 
  private int countDown = 10; 
 
  @Override 
  //  run  
  public void run() { 
    while (countDown-- > 0) { 
      System.out.println("#" + this.getName() + "(" + countDown + ")"); 
    } 
  } 
 
  public static void main(String[] args) { 
    new ThreadDemo2().start(); 
    new ThreadDemo2().start(); 
    //  start , main ,  
    System.out.println(" :"); 
  } 
} 
실행 결과:

#Thread-0(9)
#Thread-0(8)
#Thread-0(7)
#Thread-0(6)
#Thread-0(5)
#Thread-0(4)
#Thread-0(3)
#Thread-0(2)
#Thread-0(1)
#Thread-0(0)
로켓 발사 전 카운트다운:

#Thread-1(9)
#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)
3. 두 가지 방식의 비교
먼저 두 가지 방식의 출력 결과를 분석하면 똑같이 두 개의 라인을 만들었는데 왜 결과가 같지 않습니까?
Runnable 인터페이스를 사용하여 스레드를 생성하면 동일한 대상 객체를 공유할 수 있습니다(TreadDemo1 tt=New TreadDemo1();).여러 개의 동일한 스레드가 같은 자원을 처리하는 것을 실현했다.
그리고 JDK의 설명을 살펴보겠습니다.
Runnable 인터페이스는 특정한 라인을 통해 그 실례를 실행하려는 클래스에 의해 이루어져야 한다.클래스는run이라는 매개 변수가 없는 방법을 정의해야 합니다.
이 인터페이스를 설계하는 목적은 활동할 때 코드를 실행하고자 하는 대상에 공공 프로토콜을 제공하는 것이다.예를 들어, Thread 클래스는 Runnable을 구현합니다.활성화는 어떤 스레드가 시작되었고 멈추지 않았다는 뜻입니다.
또한 Runnable은 Thread 하위 클래스가 아닌 클래스에 대해 활성화 방식을 제공합니다.어떤 Thread 실례를 실례화하고 자신을 실행 목표로 삼으면, Thread 하위 클래스를 만들지 않고 Runnable 클래스를 실행할 수 있습니다.대부분의 경우 run () 방법만 다시 쓰고 다른 Thread 방법을 다시 쓰지 않으려면 Runnable 인터페이스를 사용해야 합니다.이것은 매우 중요하다. 왜냐하면 프로그래머가 클래스의 기본 행위를 수정하거나 강화하려고 하지 않으면, 이 클래스에 하위 클래스를 만들 수 없기 때문이다.
 
Thread 클래스를 상속하는 방법:
(1) 장점: 작성이 간단하고 현재 라인에 접근해야 할 경우 Thread를 사용할 필요가 없습니다.currentThread() 방법,this를 직접 사용하면 현재 라인을 얻을 수 있습니다.
(2) 단점: 스레드 클래스는 Thread 클래스를 계승했기 때문에 다른 부류를 계승할 수 없습니다.
Runnable 인터페이스 구현:
(1) 장점: 루틴 클래스는 Runable 인터페이스를 실현했을 뿐 다른 클래스를 계승할 수 있다.이런 방식에서 여러 개의 노드가 같은 목표 대상을 공유할 수 있기 때문에 여러 개의 같은 노드가 같은 자원을 처리하는 상황에 매우 적합하고 CPU 코드와 데이터를 분리하여 뚜렷한 모델을 형성하여 대상을 향한 사상을 잘 나타낼 수 있다.
(2) 단점: 프로그래밍이 좀 복잡하고 현재 라인에 접근해야 한다면 Thread를 사용해야 합니다.currentThread() 메서드입니다.
백그라운드 스레드(수호 스레드)
이른바 백그라운드 라인이란 프로그램이 실행될 때 백그라운드에서 일반적인 서비스를 제공하는 라인을 가리키며 이런 라인은 프로그램에서 없어서는 안 되거나 부족한 부분에 속하지 않는다.따라서 모든 비백그라운드 라인이 끝날 때 프로그램도 종료되고 모든 백그라운드 라인을 죽인다.반대로 말하자면, 어떤 비백그라운드 루트 (사용자 루트) 가 아직 실행 중이라면, 프로그램은 종료되지 않을 것이다.백그라운드 라인은finally 자구를 실행하지 않는 상황에서run 방법을 종료합니다.백그라운드 스레드가 만든 하위 스레드도 백그라운드 스레드입니다.다음은 백그라운드 스레드의 예입니다.

package demo.thread; 
 
import java.util.concurrent.TimeUnit; 
 
public class DaemonDemo implements Runnable { 
  @Override 
  public void run() { 
    try { 
      while (true) { 
        Thread.sleep(1000); 
        System.out.println("#" + Thread.currentThread().getName()); 
      } 
    } catch (InterruptedException e) { 
      e.printStackTrace(); 
    } finally {//  finally  
      System.out.println("finally "); 
    } 
  } 
 
  public static void main(String[] args) { 
    for (int i = 0; i < 10; i++) { 
      Thread daemon = new Thread(new DaemonDemo()); 
      //  start  
      daemon.setDaemon(true); 
      daemon.start(); 
    } 
    System.out.println("All daemons started"); 
    try { 
      TimeUnit.MILLISECONDS.sleep(1000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
  } 
} 
 
실행 결과:

All daemons started
#Thread-2
#Thread-3
#Thread-1
#Thread-0
#Thread-9
#Thread-6
#Thread-8
#Thread-5
#Thread-7
#Thread-4
분석: 결과에서 알 수 있듯이 10개 하위 스레드는 무선 순환 인쇄가 아니라 메인 스레드(main()가 종료된 후에 JVM은 모든 백그라운드 스레드를 강제로 닫습니다.finally 자구가 실행되지 않는 것과 같은 희망 확인 형식은 없습니다.

좋은 웹페이지 즐겨찾기