찾다
Javajava지도 시간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<p>그러나 이때 결과는 매우 규칙적입니다. 먼저 첫 번째 개체가 실행된 다음 두 번째 개체가 실행되며 서로 실행되지 않습니다. start() 메소드가 호출되면 JVM을 통해 run() 메소드가 발견된다는 것은 JDK 문서에서 찾을 수 있습니다. 스레드를 시작하려면 아래 start() 메서드를 시작하세요. </p><pre class="brush:php;toolbar:false">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<p>하지만 Runnable을 사용하여 정의한 하위 클래스에는 start() 메서드가 없고 Thread 클래스에만 있습니다. 이때 Thread 클래스를 살펴보면 public Thread(Runnable targer)라는 생성자가 있는데, 이 생성자는 Runnable의 하위 클래스 인스턴스를 받아들이는데, 이는 Runnable이 구현하는 멀티스레드가 Thread 클래스를 통해 시작될 수 있다는 뜻이다. (start()는 시스템 리소스를 조정할 수 있습니다): </p><pre class="brush:php;toolbar:false">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;i0){  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;i0){  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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
带你搞懂Java结构化数据处理开源库SPL带你搞懂Java结构化数据处理开源库SPLMay 24, 2022 pm 01:34 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

Java集合框架之PriorityQueue优先级队列Java集合框架之PriorityQueue优先级队列Jun 09, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

完全掌握Java锁(图文解析)完全掌握Java锁(图文解析)Jun 14, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

一起聊聊Java多线程之线程安全问题一起聊聊Java多线程之线程安全问题Apr 21, 2022 pm 06:17 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

Java基础归纳之枚举Java基础归纳之枚举May 26, 2022 am 11:50 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

详细解析Java的this和super关键字详细解析Java的this和super关键字Apr 30, 2022 am 09:00 AM

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

Java数据结构之AVL树详解Java数据结构之AVL树详解Jun 01, 2022 am 11:39 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

java中封装是什么java中封装是什么May 16, 2019 pm 06:08 PM

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구