source

스레드 start()와 Runnable run()의 차이점은 무엇입니까?

factcode 2022. 8. 11. 21:51
반응형

스레드 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

반응형