[java] thread.start () 대신 Java의 thread.run ()을 언제 호출합니까?

thread.run()대신 Java를 언제 호출 thread.start()합니까?



답변

동시성이 아닌 기능에만 관련된 특정 단위 테스트에서 run ()을 호출 할 수 있습니다.


답변

못. run ()을 직접 호출하면 일반 메서드 호출과 마찬가지로 코드가 동 기적으로 (동일한 스레드에서) 실행됩니다.


답변

양식 촬영 코드 스타일 자바 스레드 자주 묻는 질문 :

Q : 스레드의 start () 메서드와 run () 메서드의 차이점은 무엇입니까?

A : Thread 클래스의 별도 start () 및 run () 메서드는 스레드 프로그램을 만드는 두 가지 방법을 제공합니다. start () 메서드는 새 스레드의 실행을 시작하고 run () 메서드를 호출합니다. start () 메서드는 즉시 반환되고 새 스레드는 일반적으로 run () 메서드가 반환 될 때까지 계속됩니다.

Thread 클래스의 run () 메서드는 아무 작업도하지 않으므로 하위 클래스는 두 번째 스레드에서 실행할 코드로 메서드를 재정의해야합니다. Thread가 Runnable 인수로 인스턴스화되면 스레드의 run () 메서드는 대신 새 스레드에서 Runnable 개체의 run () 메서드를 실행합니다.

스레드 프로그램의 특성에 따라 Thread run () 메서드를 직접 호출하면 start () 메서드를 통해 호출하는 것과 동일한 결과를 얻을 수 있지만 후자의 경우 코드는 실제로 새 스레드에서 실행됩니다.


답변

실행 thread.run()Thread코드가 실행되는 새 파일 을 생성하지 않습니다 . thread.run()코드가 호출 된 현재 스레드에서 코드를 실행합니다.

실행 thread.start()하면 run()메서드가 호출 되는 새 OS 수준 스레드가 생성 됩니다.

본질적으로:

단일 스레드 프로그래밍 → 직접 run()메서드 호출

다중 스레드 프로그래밍 → start()메서드 호출

또한 다른 사람들이 언급했듯이 ‘테스트’는 run()코드에서 직접 호출 할 수있는 유일한 권장 사례 인 것 같습니다 .


답변

이것은 이미 언급되었지만 명확하게하기 위해 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()메서드 를 통한 호출과 동일한 출력이 제공 될 수 있지만 후자의 경우 코드는 실제로 새 스레드에서 실행됩니다.

참고