thread.run()
대신 Java를 언제 호출 thread.start()
합니까?
t.run()
실행할 때 t
'현재 스레드의 작업을하고 t.start()
실행할 때 t
스레드의 작업'을 t
자체. 아니면 실제 사용 사례를 요구하고 있습니까?
start()
! 나처럼 ...이 방법은 공개되지 않아야합니다!
thread.run()
대신 Java를 언제 호출 thread.start()
합니까?
t.run()
실행할 때 t
'현재 스레드의 작업을하고 t.start()
실행할 때 t
스레드의 작업'을 t
자체. 아니면 실제 사용 사례를 요구하고 있습니까?
start()
! 나처럼 ...이 방법은 공개되지 않아야합니다!
답변:
못. run ()을 직접 호출하면 일반 메서드 호출과 마찬가지로 코드가 동 기적으로 (동일한 스레드에서) 실행됩니다.
양식 촬영 코드 스타일 자바 스레드 자주 묻는 질문 :
Q : 스레드의 start () 메서드와 run () 메서드의 차이점은 무엇입니까?
A : Thread 클래스의 별도 start () 및 run () 메서드는 스레드 프로그램을 만드는 두 가지 방법을 제공합니다. start () 메서드는 새 스레드의 실행을 시작하고 run () 메서드를 호출합니다. start () 메서드는 즉시 반환되고 새 스레드는 일반적으로 run () 메서드가 반환 될 때까지 계속됩니다.
Thread 클래스의 run () 메서드는 아무 작업도하지 않으므로 하위 클래스는 두 번째 스레드에서 실행할 코드로 메서드를 재정의해야합니다. Thread가 Runnable 인수로 인스턴스화되면 스레드의 run () 메서드는 대신 새 스레드에서 Runnable 개체의 run () 메서드를 실행합니다.
스레드 프로그램의 특성에 따라 Thread run () 메서드를 직접 호출하면 start () 메서드를 통해 호출하는 것과 동일한 결과를 얻을 수 있지만 후자의 경우 코드는 실제로 새 스레드에서 실행됩니다.
thread's run() method executes the run() method of the Runnable object in the new thread instead.
그것은 사실이 아닙니다 (또는 적어도 내 Java 8 소스 코드가 달리 알려줍니다), 불행히도 링크가 끊어진 것처럼 보이므로 대신 여기에 실수를보고합니다.
thread.run()
아니라 thread.start()
.
이것은 이미 언급되었지만 명확하게하기 위해 run () 메서드를 호출하기 위해 새 Thread 객체를 만드는 것은 불필요하게 비용이 많이 들고 주요 위험 신호가되어야합니다. 그것은 Runnable를 IMPL 등을 만들 수있는 더 나은, 더 분리 설계 어느 것이의 (a)를 호출 그것의 그 원하는 동작, 또는 (b)는 그 Runnable를 가진 새로운 스레드를 생성하고 스레드를 시작 있다면 직접 run () 메소드를.
더 나은 디커플링 Executor
을 위해서는 JDK 5 이상에서 인터페이스와 프레임 워크를 확인하십시오 . 이것은 간단히 말해서 작업 실행 (Runnable 인스턴스) 이 실행 되는 방법 (풀의 기존 스레드를 사용하여 새 스레드에서 현재 스레드에서 Runnable을 실행할 수있는 Executor 구현)을 분리 할 수 있도록합니다. 및 기타).
전화 thread.start()
하면 차례로 전화 thread.run()
합니다. 우회 thread.start()
하여 직접 가고 싶은 경우를 생각할 수 없습니다.thread.run()
Thread 클래스 의 개별 start()
및 run()
메서드는 스레드 프로그램을 만드는 두 가지 방법을 제공합니다. start()
방법은 새 스레드의 실행을 시작하고 호출하는 run()
방법을. start()
방법은 즉시 반환하고 새로운 스레드는 일반적으로까지 계속 run()
방법 돌아갑니다.
Thread 클래스의 run()
메서드는 아무 작업도 수행하지 않으므로 하위 클래스는 두 번째 스레드에서 실행할 코드로 메서드를 재정의해야합니다. Thread가 Runnable 인수로 인스턴스화되면 스레드의 run()
메서드는 run()
대신 새 스레드에서 Runnable 개체 의 메서드를 실행합니다 .
스레드 프로그램의 특성에 따라 Thread run()
메서드를 직접 호출하면 start()
메서드 를 통한 호출과 동일한 출력이 제공 될 수 있지만 후자의 경우 코드는 실제로 새 스레드에서 실행됩니다.
The start() method returns immediately and the new thread normally continues until the run() method returns.
경우 start()
반환 즉시 어떻게 와서는 run()
그것에서 자신을 불렀다 주어진 계속 실행start()
질문이 "실행 메서드 대신 스레드 시작 메서드가 직접 호출되는 이유"인 경우 아래 예제 코드로 대답했습니다. 명확 해지기를 바랍니다. 아래 예에서 :
/*
By calling t1.start(),
we are getting the main calling thread returned immediately
after the t1.start() called and is ready to proceed for other
operations.And the thread t1 starts executing the run method of the object r.
Hence the the output will be:
I am the main thread , i created thread t1 and had it execute run method, which is currently looping from 0 to 1000000
I am done executing run method of testThread
*/
/* If we call t1.run() instead of t1.start(), (just replace t1.start() with t1.run() in the code for testing)
its like a regular method call and the main thread will not return until the run method completes,
hence the output will be:
I am done executing run method of testThread
I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000
*/
class testThread implements Runnable{
public void run()
{
for(int i=0;i<1000000;i++){} //a simple delay block to clarify.
System.out.println("I am done executing run method of testThread");
}
}
public class mainClass{
public static void main(String [] args)
{
testThread r = new testThread();
Thread t1 = new Thread(r);
t1.start(); /* Question is: can we call instead t1.run() */
System.out.println("I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000");
}
}
다른 메서드와 마찬가지로 run ()의 내용을 실행하려는 경우. 물론 스레드를 시작하지 마십시오.
적어도 JVM 1.6에서는 약간의 검사와 실행이 기본적으로 호출됩니다.
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
private native void start0();
public class TestClass implements Runnable {
public static void main(String[] args) {
TestClass tc = new TestClass();
Thread t1 = new Thread(tc);
System.out.println("Before Starting Thread " + Thread.currentThread().hashCode());
t1.start();
System.out.println("After Starting Thread " + Thread.currentThread().hashCode());
}
@Override
public void run() {
System.out.println("TestClass Run method is Running with thread " + Thread.currentThread().hashCode());
}
}