Java에서 Runnable과 Thread의 차이점은 무엇입니까?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.
