2010-08-09 3 views
7

아래 코드를 NetBeans에 넣으면 NetBeans에서 "정적 메서드 잠자기 액세스"옆에 경고 메시지를 표시합니다.Java - 정적 메서드에 액세스하기 수면 - 무엇이 잘못 되었나요?

 try { 
      Thread.currentThread().sleep(2000); 
     } 
     catch(InterruptedException ie){ 
      //continue 
     } 

내가 잘못 했나요? 내가 이것을 다르게 부르 겠어? 나는 멀티 쓰레드를하고 있지 않다. 나는 잠시 동안 잠을 자고 싶다는 간단한 기본 방법을 가지고있다.

+2

사이드 노트 : Java 5부터는 TimeUnits가 있고 이것들에 대해 잠을 잘 수 있습니다. 제 의견으로는 더 쉽게 읽을 수 있습니다. 예 : 'TimeUnit.SECONDS.sleep (2); ' –

답변

10

는 Thread.currentThread (과 동일한 스레드 클래스의 인스턴스를 리턴한다. 정적 메서드를 호출 할 때 클래스 자체에 대해서만 작업하려고합니다. 따라서 현재 스레드에서 정적 메서드를 호출하면 인스턴스에서 메서드를 호출하고 있다는 경고가 표시됩니다.

Thread a = new Thread(someRunnable); 

a.start(); 
a.sleep(2000); //this will sleep the current thread NOT a. 

편집 :

당신은 그것은 Thread.currentThread.sleep(2000);

이 사람들이 같은 일을 불 되었기 때문에 아는 것이 중요하다에 해당하는 것 Thread.sleep(2000);를 부를 것이다 그래서 우리는 어떻게 잠을합니까? 당신은 같은 생성자에 전달 된 실행 가능한 내에서 수면 호출을 작성하여 잠 :

Runnable someRunnable = new Runnable(){ 
    public void run(){ 
     Thread.sleep(2000); 
    } 
}; 

someRunnable의 실행 방법 '을에'시작되고는 Thread.currentThread은 'A'스레드 인스턴스

.

+0

그럼 어떻게 자니? – Greg

+3

@ 그렉, 당신은 '잠'하지 않고 잠들기 위해 필요한 'a'에게 메시지를 보냅니다. 이를 수행하는 한 가지 방법은'run'이 설정되는 변수를 찾도록하고, 변수가 설정된 경우 변수를 sleep로 설정하고 외부 호출자가 변수를 설정하는 데 사용할 수있는 'a'의 메소드입니다. –

6

sleep은 정적이므로 Thread.sleep(2000);으로 액세스하십시오. 현재 스레드에 영향을줍니다. javadoc 내에서

:

(일시적으로 실행을 정지) 지정된 밀리 초 동안 잠을 현재 실행중인 스레드 을 일으킴. 스레드가 모니터의 소유권을소유하지 않습니다.

무슨 의미하는 것은 다른 스레드 코드에 오직 하나를 잠을 잘 수 있다는 것입니다. 슬립() 메소드가 선언

2

그게 전부 때문에, 따라서

Thread.currentThread().sleep(2000); 
정적으로

)는

Thread.sleep(2000); 
1

스레드 클래스가 아닌 스레드 참조에서 정적 메소드에 액세스하고 있으므로 경고하는 netbeans가 있습니다. ) (이

try { 
      Thread.sleep(2000); 
     } 
     catch(InterruptedException ie){ 
      //continue 
     } 

수면 방법은는 Thread.currentThread를 호출 할 필요 자야하지 않으려면 현재 실행중인 스레드 원인보십시오.

당신이, NB 그 시간에하지 모범 사례 경고 준다 객체를 사용하여 정적 메서드에 액세스하려고 할 때마다
1

, 여기 같은 경우

는 Thread.currentThread() 당신에게 스레드의 객체를 반환 것이다

2

"sleep (long)"에 해당하는 Thread 인스턴스에 대한 메소드가 없습니다.

Thread.currentThread(). sleep (2000); 그러나 스레드 클래스에는 long 인수로 sleep()이라는 메서드가 있기 때문에 컴파일되지 않습니다.

자바에서는 컴파일러 시간 트릭을 허용하므로 메소드의 정적 액세스에 대해 혼란 스러울 때 새로운 코더가이를 실행할 수 있습니다. 이 실제로 컴파일러로 확인 무슨 그러나

은 다음과 같습니다

에 Thread.sleep (2000);

다음 코드는 동일합니다 :

스레드 t = 새 스레드 (새의 Runnable() {공공 무효 실행() {//} 아무것도하지 않고}); t.sleep (2000);

한 포스터 (John V)가 지적했듯이 실제 스레드 (t) 인스턴스를 절전 모드로 만들지는 못하기 때문에 스레드 개체를 만든 현재 스레드는 절전 모드로 전환됩니다.

인스턴스 변수의 메서드가 아닌 클래스의 정적 메서드에 액세스하고 있음을 기억하는 경고가 발생합니다.

쓰는 적절한 코드는 항상 Thread.sleep (2000)입니다. 혼동과 경고를 피하기 위해 인스턴스를 통해 정적 메서드에 액세스하지 마십시오.