2014-08-29 3 views
5

자바에서 멀티 스레딩이라는 개념을 배우고 있었는데,이 흥미로운 동작을 발견했습니다. 스레드를 만드는 다양한 방법을 실험하고있었습니다. 이제 문제의 하나는 Thread을 확장하고 Runnable 인터페이스를 구현하지 않을 때입니다. 보조 노트에 Java의 흥미로운 스레드 동작

, 나는 그것이 Runnable 인터페이스를 구현하기보다는 Thread 클래스를 확장하는 완벽한 OO의 의미가 있음을 알고 있지만,이 질문의 목적을 위해,의 우리가 Thread 클래스를 확장 가정 해 봅시다.

하자 내 확장 Thread 클래스의 내 인스턴스가 t 나는 코드 블록 내 Thread 클래스의 내 run() 메서드 내에서 작성 백그라운드에서 실행해야합니다.

그것은 백그라운드에서 완벽하게 t.start()으로 실행되었지만 약간 궁금해서 t.run() 메서드를 호출했습니다. 주 스레드에서 실행 된 코드 조각!

t.start()은 무엇입니까? t.run()은 무엇입니까?

+4

을 당신이 여기에 답을 찾을 수 있다고 생각입니다 : //stackoverflow.com/questions/8579657/java-whats-the-difference-between-thread-start-and-runnable-run http://stackoverflow.com/questions/15841301/difference-between-running-and -starting-a-thread –

+0

http : // stackoverflow.com/a/13134221/3436942는 쉬운 언어로 차이점을 알려줍니다. 거의 ** t.start(); **는 새로운 스레드를 만들고/만드는 동안 ** t.run(); **은 메인 스레드에서 호출합니다. – jbutler483

답변

8

이것이 클래스의 기능입니다. t.start()는 실제로 새 스레드를 시작한 다음 해당 스레드에서 run()을 호출합니다. run()을 직접 호출하면 현재 스레드에서 실행합니다.

public class Test implements Runnable() { 
    public void run() { System.out.println("test"); } 
} 

... 

public static void main(String...args) { 
    // this runs in the current thread 
    new Test().run(); 
    // this also runs in the current thread and is functionally the same as the above 
    new Thread(new Test()).run(); 
    // this starts a new thread, then calls run() on your Test instance in that new thread 
    new Thread(new Test()).start(); 
} 

이것은 의도 된 동작입니다.

+0

와우, 멋진 설명! 답변 주셔서 감사합니다. :) – avismara

1

t.start()은 코드가 run() 인 코드를 실행하는 새 스레드를 시작합니다. t.run()은 현재 작업중인 스레드 (사용자의 경우 기본 스레드)의 객체에 대한 함수 호출입니다.

단지 start() 스레드의 기능을 호출 할 때 새 스레드가 시작되고, 그렇지 않으면 그 함수를 호출하는 것 (start() 제외)은 다른 다른 개체에서 일반 함수를 호출하는 것과 같습니다.

+0

답장을 보내 주셔서 감사합니다. :) – avismara

0

t.start()은 실제로 새 스레드에서 run() 메서드를 실행하는 기본 호출을 만듭니다. t.run()은 현재 스레드에서 run()을 실행하기 만합니다. 이 Thread 클래스를 실제로

을 확장하는 것보다 실행 가능한 인터페이스를 구현하는 완벽한 OO의 의미가 이제

, 보조 노트에

, 내가 알고, 그것은 완벽한 OO의 의미가 있습니다 어느 쪽의 방법 (Runnable 또는 확장 Thread의 구현)에 따르는 것. OO 의미에서 나쁜 것은 아닙니다. (. 실제로 OO 디자인을 깰 ) : HTTP 당신이 구현 함으로써 얻는 이점은의 Runnable 당신이 당신의 클래스 또 다른 클래스를 확장 할 수

+0

s/메인 스레드/현재 스레드 /, AFAIK. – DarkDust

+0

나는 현재 상황과 관련하여 말하고 있었다. 'Thread'에 피쳐와 기능을 추가 할 계획이라면'Thread' 클래스를 확장하는 것이 좋습니다. 새로운 스레드를 만들고 싶다면'Runnable' 클래스를 구현하십시오. :) – avismara

+0

@DarkDust - 나는 당신을 얻지 못하고있다. – TheLostMind