2010-08-09 30 views
7

Aşağıdaki kodu NetBeans'e koyduğumda, NetBeans, "Statik yöntem uykusuna erişme" ifadesinin yanında bana bir uyarı verir.Java - Statik Yönteme Erişim Uyku - Sorun nedir?

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

Yanlış bir şey yapıyorum? Bunu farklı mı çağırmalıyım? Ben çok iş parçacıklı bir şey yapmıyorum. Sadece bir süre uyumak istediğim basit bir ana yönteme sahibim.

+2

Bir yan not olarak: Java 5'ten beri bir TimeUnits var ve bunlara uyku diyebilirsiniz, benim düşüncemde ne daha fazla okunabilir. Örneğin. ´TimeUnit.SECONDS.sleep (2); ´ –

cevap

10

Thread.currentThread (aynıdır Konu sınıfının bir örneğini verir. Statik bir yöntemi çağırırken sadece sınıfın kendisinde çalışmak istersiniz. Geçerli iş parçacığı üzerinde statik bir yöntemi çağırmak, bir örnekte yöntemi çağırdığınızı belirten bir uyarı alırsınız.

Thread a = new Thread(someRunnable); 

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

Düzenleme:

Sadece O Thread.currentThread.sleep(2000);

Bu insanlar böyle bir şey yaptığını yakıldı çünkü bilmek önemlidir eşdeğer olacaktır Thread.sleep(2000); çağırır Bu yüzden nasıl uyuyorsun? Sen gibi, yapıcıya geçirilen çalıştırılabilir içinde uyku çağırma yazarak uyku:

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

someRunnable yayınlanma yönteminde 'a' başlatıldığında, Thread.currentThread 'a' parçacığı örneğidir

. Eğer Konu sınıfından olmayan Konu referansından statik yöntemini erişen çünkü uyarı vererek

+0

Peki nasıl uyuyorsunuz? – Greg

+3

@Greg, 'uyuyamıyorsunuz', uykuya dalması gereken 'a' mesajını yolluyorsunuz. Bunu yapmanın bir yolu, "çalıştır" ın ayarlanan bir değişkene sahip olması ve değişkenin ayarlanması durumunda uykuya geçmesi ve bir dış arayıcının bu değişkeni ayarlamak için kullanabileceği bir yöntem olmasıdır. –

6

sleep statik, yani Thread.sleep(2000); ile erişebilirsiniz. Geçerli parçayı etkiler. javadoc itibaren

:

(geçici olarak yürütmenin durdurulması) milisaniye belirtilen sayıda uyku şu anda yürütülen ipliği neden olur. İş parçacığı herhangi bir monitörün sahipliğini kaybetmez.

Bunun anlamı, başka bir iş parçacığı, kod içinde sadece bir tane uyuyamıyorum olmasıdır. Uyku() metodu bildirildi

2

Thats çünkü bu nedenle

Thread.currentThread().sleep(2000); 
statik olarak

)

Thread.sleep(2000); 
1

netbeans. ) (bu

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

uyku yöntemi Thread.currentThread aramaya gerek sleep.So için şu anda yürütülen iş parçacığı neden olur deneyin.

bunu, NB o zaman değil en iyi uygulama uyarı verir edilir nesnesini kullanarak statik yöntemi erişmeye çalıştığınızda zaman
1

, burada da aynı durum

Thread.currentThread() size Konu bir nesne döndürür olduğunu

2

"Uyku (uzun)" durumuna karşılık gelen Thread örneklerinde yöntem yoktur.

Thread.currentThread(). Sleep (2000); Ancak, derleme uzun bir argüman ile uyku() olarak adlandırılan iş parçacığı üzerinde bir yöntem olduğundan derleme yapar.

Java, bir derleyici zaman hilesi olarak bunu sağlar; böylece, yeni kodlayıcılar, yöntemlerin statik erişimi konusunda kafaları karıştığında bunu çalıştırabilir. bu aslında derleyici karar ne Ancak

şöyledir:

Thread.sleep (2000);

Aşağıdaki kodu da eşdeğerdir:

Konu t = new Konu (yeni Runnable() {public void run() {//} hiçbir şey}); t.sleep (2000);

Bir posterin (John V) işaret ettiği gibi, bu, gerçek iş parçacığı (t) örneğini uyuyamıyor - iş parçacığı nesnesini oluşturan geçerli iş parçacığı uyu.

Uyarı, bir sınıf değişkeninin yöntemini değil, bir sınıfın statik yöntemine eriştiğinizi unutmayın.

Yazmak için uygun kod her zaman Thread.sleep (2000); - karışıklığı ve bu uyarıyı önlemek için bir örnek üzerinden statik yöntemlere asla erişmeyin.