2011-04-12 3 views
0

이 프로그램 생각해 출력을 실행에자바 스레드가 의심

public class test { 
    public static void main(String [] args){ 
     Runnable r = new Runnable() { 
      public void run() { 
       System.out.print("foo"); 
      } 
     }; 
     Thread t = new Thread(r) { 
      public void run() { 
       System.out.print("bar"); 
      } 
     }; 
     t.start(); 
    } 
} 

것은 내가 그래서 이유를 알고 싶습니다

bar 

입니다.

나의 이해 :

우리는 run 메소드를 재정 의하여 Runnable를 구현하는 익명의 내부 클래스를 인스턴스화합니다. 그리고 그것을 r에 대입합니다.

다음으로이 실행 가능 파일을 Thread 클래스 생성자에 전달합니다. 그러나 Run을 오버라이드하여 Thread를 확장하는 새로운 익명의 내부 클래스를 생성합니다.

이제 두 가지 실행 방법이 있으며 두 번째는 첫 번째보다 우선합니다.

내가 틀렸다면 나는 매우 혼란 스럽다.

또한 실제 Java 프로그래밍에서 사용되는 미친 것들입니까? (내 교수님은 그렇다고 말합니다. 우리를 계속 지켜주는 점 : D).

답변

3

Runnable 인스턴스를 생성자에 전달하더라도 run 메서드는 을 사용하지 않도록 오버라이드합니다. 어떻게됩니까

2

표준 Thread.run 방법은 당신이 전달 된 Runnablerun 호출하는 것입니다. 귀하의 경우에는 당신이 스레드의 행동을 무시하고 주어진 Runnable 무시한 run 방법으로 대체.

그런 미친 것들 do은 불행하게도 현실 세계에서 발생합니다. 따라서 정적 분석 도구와 단위 테스트를 사용하여 예상되는 동작을 얻는 것이 좋습니다.

0

일반적으로 Thread.run() 메서드는 스레드가 실행 파일로 구성되었는지 확인합니다. 이 경우 Runnable.run()이 호출되며 그렇지 않은 경우 아무 작업도 수행하지 않습니다. Thread.run()을 무시하여이 동작을 변경 했으므로 실행 파일이 호출되지 않습니다.

1

스레드의 run() 메서드를 재정의 할 때 스레드의 기본 동작을 재정의합니다. 이 방법으로 순서를 제어하고 r이 실행되는지 여부를 제어합니다.

public void run() { // ignores "r" 
    System.out.print("bar"); 
} 

또는

public void run() { 
    super.run(); // runs "r" first. 
    System.out.print("bar"); 
} 

또는

public void run() { 
    System.out.print("bar"); 
    super.run(); // runs "r" second. 
} 

또는

public void run() { 
    super.run(); // runs "r" first. 
    System.out.print("bar"); 
    super.run(); // and runs "r" second. 
} 

또는

public void run() { 
    r.run(); // runs "r" first. 
    System.out.print("bar"); 
    r.run(); // and runs "r" second. 
}