>  기사  >  Java  >  Java에서 Runnable과 Thread의 차이점은 무엇입니까?

Java에서 Runnable과 Thread의 차이점은 무엇입니까?

WBOY
WBOY앞으로
2023-05-07 17:19:08994검색

Java에서 멀티스레딩을 구현하는 방법에는 두 가지가 있습니다. 하나는 Thread 클래스를 상속하는 것이고, 다른 하나는 Runnable 인터페이스를 구현하는 것입니다. Thread 클래스는 java.lang 패키지에 정의되어 있습니다. 클래스가 Thread 클래스를 상속하고 이 클래스의 run() 메서드를 재정의하는 한 다중 스레드 작업을 구현할 수 있습니다. 그러나 클래스는 하나의 상위 클래스만 상속할 수 있으며 이는 이 메서드의 제한 사항입니다.

아래 예를 보세요:

package org.thread.demo;  class MyThread extends Thread{  private String name;  public MyThread(String name) {  super();  this.name = name;  }  public void run(){  for(int i=0;i<10;i++){  System.out.println("线程开始:"+this.name+",i="+i);  }  }  }  package org.thread.demo;  public class ThreadDemo01 {  public static void main(String[] args) {  MyThread mt1=new MyThread("线程a");  MyThread mt2=new MyThread("线程b");  mt1.run();  mt2.run();  }  }

그러나 이때 결과는 매우 규칙적입니다. 먼저 첫 번째 개체가 실행된 다음 두 번째 개체가 실행되며 서로 실행되지 않습니다. start() 메소드가 호출되면 JVM을 통해 run() 메소드가 발견된다는 것은 JDK 문서에서 찾을 수 있습니다. 스레드를 시작하려면 아래 start() 메서드를 시작하세요.

package org.thread.demo;  public class ThreadDemo01 {  public static void main(String[] args) {  MyThread mt1=new MyThread("线程a");  MyThread mt2=new MyThread("线程b");  mt1.start();  mt2.start();  }  };

이러한 방식으로 프로그램은 대화형 작업을 정상적으로 완료할 수 있습니다. 그렇다면 왜 여러 스레드를 시작하기 위해 start() 메서드를 사용해야 할까요?

JDK 설치 경로에서 src.zip은 전체 Java 소스 프로그램입니다. 이 코드를 통해 Thread에서 start() 메소드의 정의를 찾으면 이 메소드에서 private Native void start0()이 사용되는 것을 확인할 수 있습니다. 네이티브 키는 운영 체제의 기본 기능을 호출할 수 있고, 그런 기술이 JNI 기술(java Native Interface)이 된다는 의미입니다.

Runnable 인터페이스

실제 개발에서 멀티 스레드 작업에서는 Thread 클래스이지만 Runnable 인터페이스 Finish를 사용합니다.

public interface Runnable{  public void run();  }

예:

package org.runnable.demo;  class MyThread implements Runnable{  private String name;  public MyThread(String name) {  this.name = name;  }public void run(){  for(int i=0;i<100;i++){  System.out.println("线程开始:"+this.name+",i="+i);  }  }  };

하지만 Runnable을 사용하여 정의한 하위 클래스에는 start() 메서드가 없고 Thread 클래스에만 있습니다. 이때 Thread 클래스를 살펴보면 public Thread(Runnable targer)라는 생성자가 있는데, 이 생성자는 Runnable의 하위 클래스 인스턴스를 받아들이는데, 이는 Runnable이 구현하는 멀티스레드가 Thread 클래스를 통해 시작될 수 있다는 뜻이다. (start()는 시스템 리소스를 조정할 수 있습니다):

package org.runnable.demo;  import org.runnable.demo.MyThread;  public class ThreadDemo01 {  public static void main(String[] args) {  MyThread mt1=new MyThread("线程a");  MyThread mt2=new MyThread("线程b");  new Thread(mt1).start();  new Thread(mt2).start();  }  }

두 가지 구현 방법의 차이점과 연결:

프로그램 개발에서 다중 스레드인 한 Runnable 인터페이스의 구현은 항상 가장 중요합니다. Runnable 인터페이스 구현과 비교할 때 Thread 클래스를 상속하면 다음과 같은 이점이 있기 때문입니다.

  • 포인트 상속의 제한을 피하세요. 클래스는 여러 인터페이스를 상속할 수 있습니다.

  • 자원 공유에 적합

Thread 클래스를 통해 완성되는 티켓 판매 프로그램을 예로 들어 보겠습니다.

package org.demo.dff;  class MyThread extends Thread{  private int ticket=10;  public void run(){  for(int i=0;i<20;i++){  if(this.ticket>0){  System.out.println("卖票:ticket"+this.ticket--);  }  }  }  };

다음은 세 개의 스레드 개체를 통해 동시에 티켓을 판매하는 데 사용됩니다.

package org.demo.dff;  public class ThreadTicket {  public static void main(String[] args) {  MyThread mt1=new MyThread();  MyThread mt2=new MyThread();  MyThread mt3=new MyThread();  mt1.start();//每个线程都各卖了10张,共卖了30张票  mt2.start();//但实际只有10张票,每个线程都卖自己的票  mt3.start();//没有达到资源共享  }  }

Runnable을 사용하면 리소스 공유가 가능합니다. 아래 예를 보세요.

package org.demo.runnable;  class MyThread implements Runnable{  private int ticket=10;  public void run(){  for(int i=0;i<20;i++){  if(this.ticket>0){  System.out.println("卖票:ticket"+this.ticket--);  }  }  }  }  package org.demo.runnable;  public class RunnableTicket {  public static void main(String[] args) {  MyThread mt=new MyThread();  new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一  new Thread(mt).start();//个实例化对象mt,就会出现异常  new Thread(mt).start();  }  };

현재 프로그램에는 3개의 스레드가 있지만 총 10개의 티켓이 판매되었습니다. 이는 Runnable을 사용하여 멀티스레딩을 구현한다는 의미입니다. 자원 공유를 달성할 수 있습니다.

Runnable 인터페이스와 Thread 간의 연결:

public 클래스 Thread는 Runnable을 구현하는 객체를 확장합니다.

Thread 클래스도 Runnable 인터페이스의 하위 클래스인 것으로 나타났습니다.

위 내용은 Java에서 Runnable과 Thread의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제