2010-05-06 2 views
2
public static synchronized void main(String[] args) throws InterruptedException { 
    Thread t = new Thread(); 
    t.start(); 
    System.out.print("X"); 
    t.wait(10000); 
    System.out.print("Y"); 
    } 
  • 이 방법의 문제점은 무엇입니까?
  • 어떻게하면 지금부터 그런 문제를 피할 수 있습니까?

답변

2

이 코드에는 몇 가지 문제점이 있습니다. 난 당신이 이런 식으로 뭔가를 쓰기 위해 노력하고 의심 :

public static synchronized void main(String[] args) throws InterruptedException { 
    System.out.print("X"); 
    Thread.sleep(10000); 
    System.out.print("Y"); 
} 

Thread.sleep() 방법은 지정된 간격에 대한 현재 스레드를 일시 중단합니다. Object.wait()은 완전히 다른 것인데, 그것이 당신이 원하는 것일 것 같지 않습니다.

내가 스레드 t을 어떻게 제거했는지 알 수 있습니다. 별도의 스레드를 만들고 그 스레드에서 인쇄물을 생성하려면 스레드에게 무언가를 제공해야합니다. 당신이 t.start() 빈을 호출 그렇게 할 때, 원래의 코드가없는 스레드 몸 스레드를 생성하는 사실이었다 기록으로

public static synchronized void main(String[] args) { 
    Thread t = new Thread() { 
    public void run() { 
     System.out.print("X"); 
     try { Thread.sleep(10000); } catch (InterruptedException e) { } 
     System.out.print("Y"); 
    } 
    }; 

    t.start(); 
} 

: 그 작업을 수행하는 가장 쉬운 방법은 스레드의 run() 메소드를 오버라이드 (override)가 스레드 코드를 가지고있다 스레드는 백그라운드에서 시작하여 즉시 죽을 것입니다.

슬립 호출이 스레드 내부로 마이그레이션되었으므로 InterruptedException에 try/catch 절을 추가해야한다는 것에 유의하십시오. run()은 예외를 throw 할 수 없으므로 불행히도 예외를 포착하고 무시해야합니다.

이 글을 쓰는 또 다른 방법은 스레드 t의 나머지 작업과 메인 스레드의 나머지 작업을 수행하는 것입니다. 다음은 두 개의 스레드로 작업을 따로 분리하는 방법은 다음과 같습니다

public static synchronized void main(String[] args) throws InterruptedException { 
    Thread t = new Thread() { 
    public void run() { 
     System.out.print("X"); 
     try { Thread.sleep(10000); } catch (InterruptedException e) { } 
    } 
    }; 

    t.start(); 
    t.join(); 

    System.out.print("Y"); 
} 

을이 스레드가 자고 있기 때문에 10 초 걸릴 것이다, 실행을 완료하는 것이 대기 t.join() 호출합니다. 스레드가 완료되면 join() 메서드가 돌아가서 주 스레드를 계속 허용합니다. 최종 결과는 사용자에게 동일하게 나타납니다. 프로그램은 X를 인쇄하고 10 초 동안 일시 중지 한 다음 Y를 인쇄합니다.

1

글쎄, 요한의 제안이 그 일을합니다. 그러나 예외가 발생 했음에도 여전히 흐릿함을 느낄 수 있습니다. 이를 위해 Object.wait() 방법 설명서와 IllegalMonitorStateException 설명서를 읽어 보시기 바랍니다.

이 글을 읽은 후, 오브젝트의 모니터가 도대체 ​​무엇이겠습니까? 그래서 여기서부터 wikibooks,

각 개체에는 '개체 모니터'가 있습니다. 기본적으로 스레드에 의해 중요 코드 섹션 코드가 실행되고 있는지 나타내는 'semaphore'입니다. 중요한 섹션을 실행하려면 스레드 이 '객체 모니터'를 얻어야합니다. 한 번에 하나의 스레드 만 만 소유 할 수 있습니다. 개체의 모니터.

관련 문제