[java] Thread start ()와 Runnable run ()의 차이점은 무엇입니까?

이 두 개의 Runnable이 있다고 가정 해보십시오.

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도구 용 클래스의 두 상이한 개체 Runnable인터페이스 따라서 구현 run()방법. 호출 r1.run()하면 현재 스레드에서 실행 중입니다.

두 번째 예 : 두 개의 별도 스레드.

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1그리고 t2클래스의 객체입니다 Thread. 를 호출 t1.start()하면 새 스레드가 시작되고 내부적으로 해당 run()메소드를 호출하여 r1해당 새 스레드 내에서 스레드를 실행합니다.


답변

방금 run()직접 호출 하면 다른 메소드 호출과 마찬가지로 호출 스레드에서 실행됩니다. Thread.start()runnable의 run메소드가 병렬로 실행 되도록 실제로 새 스레드를 작성하는 데 필요합니다 .


답변

차이점은 메소드 Thread.start()를 호출하는 스레드 를 시작하는 run()반면 현재 스레드 Runnable.run()에서 run()메소드를 호출하는 것입니다.


답변

차이는 프로그램이 호출 할 때이다 start()방법을하는 새로운 스레드가 생성되고 코드 내부가 run()실행되지 않은 새로운 전화 할 경우 동시에 스레드 run()방법을 직접 새로운 스레드가 생성되고 코드 내부를 run()직접 현재의 thread로 실행됩니다.

Java 스레드 와의 또 다른 차이점 은 두 번 호출 할 수 없다는 것 입니다. 일단 시작되면 두 번째 호출은 Java에서 발생하지만 메소드는 일반적인 메소드 이므로 여러 번 호출 할 수 있습니다 .start()run()start()start()IllegalStateExceptionrun()


답변

실제로 Thread.start()새 스레드를 만들고 자체 실행 시나리오가 있습니다.

Thread.start()run()메소드를 비동기식으로 호출하여 새 스레드의 상태를 Runnable로 변경합니다.

그러나 Thread.run()새로운 스레드를 만들지 않습니다. 대신 현재 실행중인 스레드에서 run 메소드를 동 기적으로 실행합니다.

사용중인 경우 Thread.run()멀티 스레딩 기능을 전혀 사용하지 않습니다.


답변

invoke run()는 다른 메소드 호출과 마찬가지로 호출 스레드에서 실행됩니다. 반면 Thread.start()새로운 스레드를 만듭니다. 호출 run()은 프로그래밍 방식의 버그입니다.


답변

run()main 메소드에서 수행하는 경우 main 메소드의 스레드는 run실행해야하는 스레드 대신 메소드를 호출합니다 .

start()메소드는 새 스레드를 작성하고 run()메소드를 수행해야합니다.