스레드 start()와 Runnable run()의 차이점은 무엇입니까?
예를 들어 다음과 같은 두 가지 Runnables가 있습니다.
class R1 implements Runnable {
public void run() { … }
…
}
class R2 implements Runnable {
public void run() { … }
…
}
그렇다면 이 두 가지 차이점은 무엇일까요?
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
r1.run();
r2.run();
}
그리고 이것은:
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
첫 번째 예:다중 스레드는 없습니다.둘 다 단일(기존) 스레드로 실행됩니다.스레드가 생성되지 않았습니다.
R1 r1 = new R1();
R2 r2 = new R2();
r1
★★★★★★★★★★★★★★★★★」r2
를 실장하는 클래스의 다른2개의 오브젝트일 뿐입니다.Runnable
하여 구현합니다.run()
★★★★★★★★★★★★★★★★★★★★★★★★★★.r1.run()
현재 스레드에서 실행 중입니다.
두 번째 예:두 개의 개별 스레드
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1
★★★★★★★★★★★★★★★★★」t2
는 클래스의 오브젝트입니다.전화할 때t1.start()
하여 """를 호출합니다run()
의 of의 r1
새로운 스레드 내에서 실행할 수 있습니다.
" " " 를 하는 run()
직접적으로는 다른 메서드 호출과 마찬가지로 호출 스레드에서 실행됩니다. Thread.start()
실행 스레드가 됩니다.run
이치노
점은 '하다'는 것입니다.Thread.start()
는 를 합니다.run()
, 「」, 「」)Runnable.run()
전화만 하면 된다run()
메서드를 지정합니다.
점은 할 때start()
메서드, 새 스레드가 생성되고 내부 코드가 지정됩니다.run()
스레드로 단, "Call"을 호출하면 "Calling"이 됩니다.★★★★★★★★★★★★★★★★★,run()
됩니다.run()
는 현재 스레드에서 직접 실행됩니다.
의 또 다른 start()
★★★★★★★★★★★★★★★★★」run()
를 호출할 수 .start()
번, 한 번 두 번째, 두 번째, 두 번째, 두 번째, 두 번째 시작start()
하면 throw call를 던지다IllegalStateException
를 호출할 수 있는 Java를 호출할 수 .run()
몇 번이고 반복할 수 있습니다.그냥 평범한 방법이기 때문에.
★★★★★★★★★★★★★★★★★.Thread.start()
는 새로운 스레드를 생성하여 자체 실행 시나리오를 가지고 있습니다.
Thread.start()
라고 부르다run()
method는 비동기적으로 새 스레드 상태를 실행 가능으로 변경합니다.
★★★★★★★★★★★★★★★★★.Thread.run()
는 새로운 스레드를 작성하지 않습니다.대신 현재 실행 중인 스레드에서 실행 메서드를 동기화하여 실행합니다.
「 」를 사용하고 Thread.run()
멀티 스레드 기능을 전혀 사용하지 않습니다.
run()
는 다른 메서드콜과 마찬가지로 발신 스레드에서 실행됩니다.반면에.Thread.start()
호출하다run()
프로그램 버그입니다.
하면.run()
메서드의 메서드의 스레드를 합니다.run
실행하는데 필요한 스레드 대신 메서드를 사용합니다.
start()
이 method는 새로운 스레드를 만듭니다.run()
을 강구해야 한다
t.start()
는 새로운 스레드가 필요할 때 라이브러리에서 코드를 호출하는 방법입니다.
r.run()
는 라이브러리가 새로운 스레드를 호출하기 위해 제공하는 메서드입니다.
이러한 답변의 대부분은 큰 그림을 놓치고 있습니다.즉, 자바 언어에 관한 한, 두 언어 사이에 더 이상 차이가 없다는 것입니다.t.start()
그리고.r.run()
다른 두 가지 방법 사이에 있는 것보다 더 많은 것을 알 수 있습니다.
둘 다 방법일 뿐이야둘 다 자신을 부른 실타래를 타고 달린다.그들 둘 다 코드화된 대로 행동하고, 그리고 나서 그들은 여전히 같은 맥락으로 방문객들에게 돌아간다.
가장 큰 차이점은 대부분의 코드가t.start()
는 네이티브 코드입니다만, 대부분의 경우,r.run()
순수한 자바가 될 것입니다.하지만 그건 큰 차이가 없어요.암호는 암호다.네이티브 코드는 찾기가 더 어렵고 찾았을 때 이해하기 어렵지만 여전히 컴퓨터에 무엇을 해야 할지 알려주는 코드일 뿐입니다.
그럼 어떻게 해야 할까요?t.start()
할 수 있을까?
새로운 네이티브 스레드를 생성하여 해당 스레드가 호출되도록 준비합니다.t.run()
새로운 스레드를 실행하도록 OS에 지시합니다.그리고 다시 돌아온다.
그리고 무엇이r.run()
할 수 있을까?
재밌는 건 이 질문을 하는 사람이 쓴 사람이라는 거예요. r.run()
사용자가 설계한 것(즉, 작성한 개발자)이 수행하는 모든 작업을 수행합니다.
Thread.start()
코드는 스레드를 스케줄러에 등록하고 스케줄러는 콜을 발신합니다.run()
방법.또한.Thread
클래스인 동안Runnable
는 인터페이스입니다.
멤버들의 포인트는 괜찮으니까 한마디 덧붙이고 싶은 게 있어요.문제는 JAVA가 멀티 상속을 지원하지 않는다는 것입니다.단, 클래스 B를 다른 클래스A에서 파생하고 싶지만 하나의 클래스에서만 파생할 수 있는 경우.여기서 문제는 두 가지 클래스에서 어떻게 '파생'하느냐입니다.A와 스레드따라서 Runnable Interface를 사용할 수 있습니다.
public class ThreadTest{
public void method(){
Thread myThread = new Thread(new B());
myThread.start;
}
}
public class B extends A implements Runnable{...
직접 전화하시면run()
method, multiple-timeout 기능을 사용하지 않습니다.run()
메서드는 발신자 스레드의 일부로 실행됩니다.
전화하시면start()
스레드의 메서드. Java Virtual Machine은 run() 메서드를 호출하고 2개의 스레드가 동시에 실행됩니다.Current Thread ( )main()
예) 및 기타 스레드(실행 가능)r1
를 참조해 주세요).
의 소스 코드를 참조해 주세요.start()
스레드 클래스의 메서드
/**
* Causes this thread to begin execution; the Java Virtual Machine
* calls the <code>run</code> method of this thread.
* <p>
* The result is that two threads are running concurrently: the
* current thread (which returns from the call to the
* <code>start</code> method) and the other thread (which executes its
* <code>run</code> method).
* <p>
* It is never legal to start a thread more than once.
* In particular, a thread may not be restarted once it has completed
* execution.
*
* @exception IllegalThreadStateException if the thread was already
* started.
* @see #run()
* @see #stop()
*/
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();
위 코드에서는 호출을 볼 수 없습니다.run()
방법.
private native void start0()
전화의 책임이 있다.run()
방법.JVM은 이 네이티브 메서드를 실행합니다.
첫 번째 경우, 단지 를 호출하고 있을 뿐입니다.run()
의 방법r1
그리고.r2
물건들.
두 번째 예에서는 실제로 2개의 새 스레드를 만듭니다.
start()
전화할 것이다run()
언제부턴가!
스레드 클래스의 개별 start() 메서드와 run() 메서드는 스레드 프로그램을 만드는 두 가지 방법을 제공합니다.start() 메서드는 새 스레드의 실행을 시작하고 run() 메서드를 호출합니다.start() 메서드는 즉시 반환되며 새 스레드는 보통 run() 메서드가 반환될 때까지 계속됩니다.
스레드 클래스의 run() 메서드는 아무것도 하지 않으므로 하위 클래스는 두 번째 스레드에서 실행할 코드로 메서드를 덮어씁니다.스레드가 Runnable 인수로 인스턴스화되면 스레드의 run() 메서드가 대신 새 스레드에서 Runnable 객체의 run() 메서드를 실행합니다.
스레드 프로그램의 특성에 따라 스레드 run() 메서드를 직접 호출하면 start() 메서드를 통해 호출하는 것과 동일한 출력을 얻을 수 있지만 후자의 경우 코드가 실제로 새 스레드로 실행됩니다.
스레드 확장 클래스의 Start() 메서드 호출 실행 오버라이드 메서드와 Runnable은 인터페이스를 구현합니다.
그러나 run()을 호출하여 실행 메서드를 검색하지만 클래스가 Runnable 인터페이스를 구현하는 경우 Runnable의 run() 덮어쓰기 메서드를 호출합니다.
예:
`
public class Main1
{
A a=new A();
B b=new B();
a.run();//This call run() of Thread because run() of Thread only call when class
//implements with Runnable not when class extends Thread.
b.run();//This not run anything because no run method found in class B but it
//didn't show any error.
a.start();//this call run() of Thread
b.start();//this call run() of Thread
}
class A implements Runnable{
@Override
public void run() {
System.out.println("A ");
}
}
class B extends Thread {
@Override
public void run() {
System.out.println("B ");
}
}
`
언급URL : https://stackoverflow.com/questions/8579657/whats-the-difference-between-thread-start-and-runnable-run
'source' 카테고리의 다른 글
포토샵은 어떻게 두 이미지를 함께 섞나요? (0) | 2022.08.11 |
---|---|
"mod"와 "remainer"의 차이점은 무엇입니까? (0) | 2022.08.11 |
Vuex 모델 업데이트가 계산된 속성을 다시 로드하지 않음 (0) | 2022.07.21 |
VueJS 2 - https로 리다이렉트하는 방법 (0) | 2022.07.21 |
Java에서 일반 유형의 인스턴스를 생성하시겠습니까? (0) | 2022.07.21 |