Java에서 Runnable과 Thread의 차이점 분석

6070 단어 javarunnablethread
라인의 시작은 간단하게 당신의 RUN 방법을 호출하는 것이 아니라, 하나의 라인 스케줄러가 당신의 모든 라인을 호출하는 RUN 방법입니다.
우리의 일반적인 RUN 방법은 실행이 끝나지 않으면 돌아오지 않는다. 즉, 계속 실행된다. 그러면 RUN 방법 아래의 방법은 실행할 수 없다. 그러나 라인 안의 RUN 방법은 다르다. 일정한 CPU 시간만 있고 실행된 후에 다른 라인을 준다. 이렇게 반복적으로 CPU의 시간을 이리저리 자르면 전환의 속도가 매우 빠르기 때문에 우리는 많은 라인이 동시에 운행하는 것을 느낀다.
런을 간단하게 호출하는 방법은 이런 효과가 없기 때문에,Thread류의start방법을 호출하여 라인을 시작해야 합니다.그래서 네가 라인을 시작하는 데는 두 가지 방법이 있어.
첫째, 클래스를 쓰고Thread클래스에서 계승한 다음run방법을 다시 쓰고start방법으로 라인을 시작합니다
둘째, 클래스를 써서 Runnable 인터페이스를 실현하고 안에 있는run방법을 실현하고 new Thread(Runnable target)를 사용한다.start () 방법으로 시작
이 두 가지 방법은 모두 반드시 RUN 방법을 실현해야 한다. 이렇게 하면 라인이 작동할 때 라인 관리자가 당신의 RUN 방법을 호출할 수 있다.
당신의 TestThread는 Thread 클래스에서 계승되지 않았는데, 어떻게 start 방법이 있을 수 있습니까?
자바에서 두 가지 방식으로 다중 스레드를 실현할 수 있는데 하나는 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(); 
} 
}
그러나 이때 결과는 매우 규칙적이다. 첫 번째 대상이 실행되고 두 번째 대상이 실행되며 서로 실행되지 않는다.JDK 문서에서 start() 메서드가 호출되면 JVM을 통해 run() 메서드를 찾을 수 있습니다.다음 시작 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은 모든 자바 원본 프로그램으로 이 코드를 통해Thread의start() 방법의 정의를 찾을 수 있으며, 이 방법에서privatenativevoidstart0()을 사용한 것을 발견할 수 있습니다.그 중에서 native 키워드는 운영체제의 하부 함수를 호출할 수 있음을 나타낸다. 그러면 이런 기술은 JNI기술(java Native Interface)이 된다.
Runnable 커넥터
실제 개발에서 다중 스레드의 작업은 Thread 클래스를 거의 사용하지 않고 Runnable 인터페이스를 통해 이루어진다.

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의 하위 클래스 실례를 받아들인다. 즉, Thread 클래스를 통해 Runnable가 실현하는 다중 라인을 시작할 수 있다는 것이다.(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(); 
    } 
    }; 
    현재 프로그램에는 세 개의 라인이 있지만 모두 10장의 표가 팔렸다. 즉, Runnable를 이용하여 다중 라인을 실현하면 자원 공유의 목적을 달성할 수 있다는 것이다.
    Runnable 인터페이스와 Thread 간의 연결:
    
    public class Thread extends Object implements Runnable
    Thread 클래스도 Runnable 인터페이스의 하위 클래스인 것을 발견했습니다.
    이를 통해 알 수 있듯이 Runnable 인터페이스를 실현하는 것은 Thread 클래스를 계승하는 것보다 다음과 같은 현저한 장점이 있다.
    (1) 여러 개의 같은 프로그램 코드의 라인이 같은 자원을 처리하는 상황에 적합하고 가상 CPU(라인)와 같은 프로그램의 코드, 데이터를 효과적으로 분리하여 대상을 대상으로 하는 디자인 사상을 잘 나타냈다.
    (2) Java의 단일 상속 특성으로 인한 한계를 피할 수 있습니다.우리는 이러한 상황에 자주 부딪힌다. 즉, 우리가 이미 어떤 종류를 계승한 하위 클래스를 다중 라인에 넣으려면 한 종류가 두 개의 부류를 동시에 가질 수 없기 때문에Thread류를 계승하는 방식을 사용할 수 없다. 그러면 이 클래스는 Runnable 인터페이스를 실현하는 방식만 사용할 수 있다.
    (3) 프로그램의 건장성에 유리하고 코드는 여러 라인에 공유될 수 있으며 코드와 데이터는 독립적이다.여러 라인의 실행 코드가 같은 종류의 실례에서 왔을 때, 즉 같은 코드를 공유한다고 한다.여러 개의 스레드가 같은 데이터를 조작하는데, 그것들의 코드와 무관하다.공유 접근이 같은 대상은 같은 데이터를 공유하는 것이다.루틴이 구조될 때 필요한 코드와 데이터는 하나의 대상을 통해 구조 함수로 실참하여 전달된다. 이 대상은 바로 Runnable 인터페이스를 실현한 클래스의 실례이다.
    위에서 말한 것은 여러분이 소개해 드린 자바에서 Runnable과 Thread의 차이점입니다. 여러분께 도움이 되었으면 합니다. 궁금한 점이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 답장을 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

    좋은 웹페이지 즐겨찾기