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 중국어 웹사이트의 기타 관련 기사를 참조하세요!