추천, 2020

에디터의 선택

자바에서 Thread Class와 Runnable Interface의 차이점

스레드는 두 가지 방법으로 정의 할 수 있습니다. 우선, 이미 Runnable 인터페이스를 구현 한 Thread 클래스확장합니다 . 둘째, Runnable 인터페이스 를 직접 구현합니다 . 스레드 클래스를 확장하여 스레드를 정의 할 때 스레드 클래스의 run () 메소드를 대체해야합니다. Runnable 인터페이스를 구현하는 thread를 정의 할 때는, Runnable 인터페이스의 run () 메소드만을 구현할 필요가 있습니다. Thread와 Runnable의 기본적인 차이점은 Thread 클래스를 확장하여 정의 된 각 스레드가 고유 한 객체를 만들고 해당 객체와 연결된다는 것입니다. 한편, Runnable 인터페이스를 구현하는 것으로 정의 된 각 thread는 같은 객체를 공유합니다.

Thread와 Runnable 사이의 다른 차이점을 아래 비교 차트의 도움으로 관찰 해 보겠습니다.

비교 차트

비교의 근거실행 파일
기본각 스레드는 고유 한 객체를 만들고 관련 객체를 가져옵니다.여러 스레드가 동일한 객체를 공유합니다.
기억각 스레드가 고유 한 객체를 만들면 더 많은 메모리가 필요합니다.여러 스레드가 동일한 객체를 공유하므로 메모리 사용량이 적습니다.
확장Java에서는 다중 상속이 허용되지 않으므로 클래스가 Thread 클래스를 확장 한 후에는 다른 클래스를 확장 할 수 없습니다.클래스가 Runnable 인터페이스를 구현하는 thread를 정의하는 경우, 1 개의 클래스를 확장 할 기회가 있습니다.
용도사용자는 Thread 클래스의 다른 메서드를 재정의하려는 경우에만 스레드 클래스를 확장해야합니다.run 메소드를 전문화하고 싶다면, Runnable을 구현하는 것이 더 좋은 옵션이다.
연결Extending Thread 클래스는 클래스에 Thread 클래스의 코드와 스레드에 할당 된 작업이 포함되어 있기 때문에 긴밀한 결합을 도입합니다.Runnable 인터페이스를 구현하면 Thread의 코드가 Thread의 작업과 분리되어 느슨한 결합이 발생합니다.

스레드 클래스 정의

Threadjava.lang 패키지의 클래스입니다. Thread 클래스는 Object 클래스를 확장하고 Runnable 인터페이스를 구현합니다. Thread 클래스에는 스레드를 만들고 조작 할 수있는 생성자와 메소드가 있습니다. 여러 개의 스레드를 만들면 각 스레드가 고유 한 개체를 만들고 해당 개체와 연결됩니다. Thread 클래스를 확장하는 스레드를 만들면 java가 다중 상속을 지원하지 않으므로 다른 클래스를 확장 할 수 없습니다. 따라서 Thread 클래스의 다른 메서드를 재정의하려는 경우에만 Thread 클래스를 확장해야합니다. Thread 클래스를 확장하는 스레드를 만드는 예제를 보자.

 / * 스레드 정의 * / Mythread 클래스는 스레드의 {/ * 작업을 확장합니다 * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ( "Child Thread" ); }} 클래스 mainThread {/ * 메인 스레드의 작업 * / public static void main (String args []) {Mythread mt = new Mythread (); / * 메인 스레드가 자식 스레드를 만들었습니다. * / mt.start (); for (int i = 0; i <10; i ++) {System.Out.Print ( "Main Thread"); }}} / * 출력 * / 메인 스레드 메인 스레드 메인 스레드 메인 스레드 자식 스레드 자식 스레드 자식 스레드 자식 스레드 자식 스레드 메인 스레드 자식 스레드 메인 스레드 메인 스레드 자식 스레드 자식 스레드 메인 스레드 메인 스레드 자식 스레드 자식 스레드 메인 스레드 

위의 코드에서 Thread 클래스를 확장하고 Thread 클래스의 run 메서드를 재정의하는 Mythread 클래스를 만듭니다. 메인 메서드를 포함하는 클래스에서 Mythread 클래스의 스레드 객체 (mt)를 만들고 스레드 객체를 사용하여 start () 메소드를 호출했습니다. start 메소드는 스레드의 실행을 시작하고 동시에 JVM은 스레드의 run 메소드를 호출합니다. 이제 메인 쓰레드에 의해 생성 된 하나의 메인 쓰레드와 두번째 쓰레드가 프로그램에 두 개의 쓰레드가있다. 두 스레드의 실행은 동시에 발생하지만 정확한 출력은 가장 할 수 없습니다.

Runnable 인터페이스의 정의

Runnablejava.lang 패키지의 인터페이스입니다. Runnable 인터페이스를 구현하면 스레드를 정의 할 수 있습니다. Runnable 인터페이스에는 Runnable 인터페이스를 구현하는 클래스에 의해 구현되는 단일 메소드 run () 이 있습니다. Runnable 인터페이스를 구현하는 쓰레드를 정의하도록 선택하면 다른 클래스를 확장 할 수있다. Runnable 인터페이스를 구현해 복수의 thread를 작성하면 (자), 각 thread가 같은 실행 가능 인스턴스를 공유합니다. Runnable 인터페이스를 사용하여 스레드를 정의하는 방법을 배우자.

 / * 스레드 정의 * / 클래스 Runnablethread는 Runnable {/ * 스레드의 작업 * / public void run () {for (int i = 0; i <10; i ++) {System.Out.Println ( "Child Thread" ); }} 클래스 mainThread {/ * 메인 스레드의 작업 * / public static void main (String args []) {Mythread rt = new Mythread (); / * 메인 스레드가 실행 가능한 객체를 생성했습니다. * / Thread t = new Thread (rt); / * 메인 쓰레드는 자식 쓰레드를 생성하고 runnable 객체를 전달한다 * / t.start (); for (int i = 0; i <10; i ++) {System.Out.Print ( "Main Thread"); }}} / * 출력 * / 메인 스레드 메인 스레드 메인 스레드 메인 스레드 자식 스레드 자식 스레드 자식 스레드 자식 스레드 자식 스레드 메인 스레드 자식 스레드 메인 스레드 메인 스레드 자식 스레드 자식 스레드 메인 스레드 메인 스레드 자식 스레드 자식 스레드 메인 스레드 

위의 코드에서 Runnable 인터페이스를 구현하는 클래스 Runnablethread를 만들고 Runnable 인터페이스의 run () 메서드를 구현하여 스레드의 작업을 정의합니다. 그런 다음 main 메서드를 포함하는 mainthread 클래스를 만듭니다. main 메소드 내에서 Runnablethread 클래스의 실행 가능한 객체를 선언하고 스레드를 선언하는 동안이 객체를 Thread의 생성자에 전달했습니다. 이 방법으로 스레드 개체 (t)를 실행 가능한 개체 (rt)에 연결했습니다. 다음에, thread 오브젝트는, Runnablethread 클래스의 run 메소드를 추가로 호출하는 thread의 start 메소드를 호출합니다. runnable 객체와 Thread 객체를 연결하지 않았다면 Thread 시작 메소드는 Thread 클래스의 run 메소드를 호출했을 것이다. 자, 다시 코드에 두 개의 스레드가 있으며, 주 스레드와 주 스레드는 하위 스레드를 동시에 생성하지만 동시에 정확한 결과를 얻을 수는 없습니다.

Java에서 스레드와 Runnable의 주요 차이점

  1. Thread 클래스를 확장하여 생성 된 각 스레드는 고유 한 객체를 만들어 해당 객체와 연관시킵니다. 한편, Runnable 인터페이스를 구현해 작성된 각 thread는 같은 실행 가능 인스턴스를 공유합니다.
  2. 스레드 클래스를 확장하여 생성 될 때 각 스레드는 고유 한 객체와 연관되므로 더 많은 메모리가 필요합니다. 한편, Runnable 인터페이스를 구현해 작성된 각 thread는, 같은 오브젝트 공간을 공유하고 있기 때문에, 메모리가 적게 필요합니다.
  3. Thread 클래스를 확장하면 Java가 다중 상속을 허용하지 않기 때문에 다른 클래스를 상속 할 수 있지만 Runnable을 구현하면 클래스가 다른 클래스를 상속 할 수있는 기회가 제공됩니다.
  4. Thread 클래스의 다른 메소드를 오버라이드하거나 특수화해야하는 경우에만 Thread 클래스를 확장해야한다. run 메소드 만 특수화하려면 Runnable 인터페이스를 구현해야합니다.
  5. Thread 클래스를 확장하면 Thread 클래스의 코드와 Thread 클래스의 작업이 동일한 클래스에 포함되므로 코드에서 밀접하게 결합됩니다. 반면에, Runnable 인터페이스 구현은 스레드 코드가 스레드에 할당 된 작업에서 분리되므로 코드에서 느슨한 결합을 가져옵니다.

결론:

Thread 클래스를 확장하는 대신 Runnable 인터페이스를 구현하는 것이 바람직합니다. Runnable을 구현하면 스레드 코드가 스레드에 작업을 할당하는 클래스와 다르기 때문에 코드가 느슨하게 결합됩니다. 적은 메모리가 필요하며 클래스가 다른 클래스를 상속 할 수 있습니다.

Top