Java 스레드에서 start와 run 방법의 전면적인 해석

2131 단어 java라인runstart
사용자 정의 스레드 두 가지 방법
runnable 인터페이스의 실현 클래스를 사용자 정의한 다음thread를 구성합니다. 즉thread에 runnable 인터페이스 클래스를 전달합니다.
newthread나thread 하위 클래스를 작성하여run 방법을 덮어씁니다.(new의thread와run을 덮어쓰는 방법은 사실상 익명 내부 클래스의 한 방식)
예제 코드

public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("create thread by passing a runnable target !");
}
}).start();
new Thread(){
@Override
public void run() {
System.out.println("create thread by Override run method !");
};
}.start();
}
상기 1, 2 두 가지 구조 라인에 대응하는 방법은 코드 작성법으로 익명 클래스 대상을 설계하기 때문에 다음과 같은 보조 설명을 한다.
1. 첫 번째 단락에 익명의 runnable 실례를 직접 전송했습니다. runnable 실례를 사용자 정의하고 newthread(runnable)라는 형식으로thread를 얻을 수 있습니다.
2. 두 번째 단락에 대해class가extendsthread 기류를 제거하고 new라는 새로운 스레드 클래스를 정의할 수 있습니다.
3. 이 두 단락은 모두 직접 newthread로 익명 클래스 대상을 만들고 변수thread1,thread2를 정의한 다음thread1을 이용합니다.start() thread2.start () 시작 루트;
원본 분석
이 두 가지 방식은 어떤 차이가 있습니까? 양자의 최종 효과는 같습니다. 원본 코드 등급을 보면thread의 기본적인run방법(덮어쓰지 않으면)은 target(target이 비어 있지 않으면)을 호출하는run방법입니다. target은 우리가 전송한runnable 인터페이스 클래스입니다.

public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
라인의start는 최종적으로native의start0을 호출합니다. 이 방법은 jvm 가상 컴퓨터가 라인의run 방법을 호출합니다.

public void run() {
if (target != null) {
target.run();
}
}
여기 target은 Thread의 runnable 대상입니다.
private Runnable target;
총결산
thread의run방법을 복사하는 것은start할 때 라인을 실행하는 run방법이다.
runnable에 전송되면start는 기본 run 방법을 실행합니다. run 방법에서 전송된 target을 호출하고 target의run 방법을 호출합니다.
양자의 효과는 같다. 여기는 단지 우리가 코드의 세부 차이를 보러 가는 것을 도울 뿐이다.
위에서 말한 것은 여러분이 소개한 자바 라인에서 start와run 방법을 전면적으로 해석하는 것입니다. 여러분께 도움이 되었으면 합니다. 만약에 더 많은 내용을 알고 싶으면 저희를 주목해 주십시오!

좋은 웹페이지 즐겨찾기