2012-11-28 2 views
1
class Qus3 extends Thread implements Runnable { 

    public static void main(String args[]) { 
     Qus3 q3 = new Qus3(); 
     q3.start(); 
    } 
} 

이 코드는 오류없이 컴파일하지만 그렇지 않으면 hasn 위의 코드 클래스 abstract.In 클래스를 선언 모든 방법을 인터페이스의 를 정의 할 필요는 없습니다를 정의하지 않습니다 그것은 추상적 인 것으로 선언되었고 run()은 Runnable 인터페이스를 구현 했음에도 클래스에 의해 정의되지 않았다. 왜 코드가 여전히 정확한가?클래스는 실행 가능한 인터페이스를 구현하지만, 실행 방법

+4

run()을 가진 Thread를 확장하기 때문에 –

+0

또한'Thread'는'Runnable'을 구현하므로'Runnable'을 생략하면 코드가 달라지지 않을 것입니다. – jlordo

답변

0

클래스는 Runnable을 구현하지만 Thread도 확장합니다. 내부 스레드는 또한 Runnable을 구현하고 구현을 제공합니다. 그것이 성공적으로 컴파일되는 이유입니다.

extends Thread을 제거하면 컴파일 오류가 발생합니다.

2

스레드는 Runnable을 구현합니다. from the API :

공공 무효 실행()

이 thread가 별개의 Runnable 실행 객체를 사용해 작성되었을 경우, 이 Runnable 객체의 run 메소드가 호출; 그렇지 않으면이 메서드는 아무 작업도 수행하지 않고 반환합니다.

스레드의 서브 클래스는이 메소드를 대체해야합니다.

따라서 컴파일 오류는 발생하지 않지만 run은 아무 것도하지 않습니다. 새로 시작된 스레드는 빈 run 메소드를 실행하고 종료됩니다.

코드가 맞지만 Thread를 확장하지 않고 별도의 Runnable을 생성하여 새 스레드에 전달하는 것이 좋습니다. 그렇게하면 스레드 이외의 다른 것을 확장 할 수있을뿐만 아니라 우연히 스레드 메소드를 무시할 위험이 없습니다.

1

스레드를 확장하면 스레드 대체가 실행되므로 실행 방법이 구현됩니다.

관련 문제