Soru Thread.sleep () ile Java performans sorunu


Inline Java IDE ipucu, "Thread.sleep'ı döngü içinde çağırmak, performans sorunlarına neden olabilir." Belgelerdeki başka bir yerde hiçbir açıklamayı bulamadım. bu açıklama.

Niye ya? Nasıl? Bir iş parçacığının yürütülmesini geciktirmek için başka hangi yöntem olabilir?


21
2017-10-18 03:52


Menşei


Belki de soruyu, bazı IDE'lerden bir uyarı olduğunu açıklığa kavuşturmak için değiştirebilirsiniz. - ShiDoiSi


Cevaplar:


Bu o değil Thread.sleep Bir döngüde bir performans sorunu, ancak yanlış bir şey yaptığınız genellikle bir ipucu.

while(! goodToGoOnNow()) {
   Thread.sleep(1000);
}

kullanım Thread.sleep Yalnızca iş parçanızı belirli bir süre için askıya almak istiyorsanız. Belirli bir şartı beklemek istiyorsanız onu kullanmayın.

Bu durum için kullanmalısınız wait/notify bunun yerine veya eşzamanlı kullanım paketlerindeki bazı yapılar.

İle sorgulama Thread.sleep Sadece geçerli JVM'nin dışındaki durumları beklerken kullanılmalıdır (örneğin başka bir işlemin dosya yazmasını beklerken).


33
2017-10-18 03:59



Cevaplar için teşekkürler. İş parçacığı, TCP üzerinden harici bir dişli parçasına aktarılıyor ve çalışmaya başlamasını bekliyor: - fcw
Protokol, koşuyor musun? Hayır. Uyku ..... Koşuyor musunuz? Hayır. Uyuyor musunuz? Evet. Devam ... Yani sorun yok. Teşekkürler! - fcw
InterruptedException'ı unutma. - Andrew S


Bu, beklemenin, işi tamamlayan başka bir iş parçacığına bağlı olup olmamasına bağlıdır, bu durumda, kullanmanız gerekir. korumalı bloklarveya Üst düzey eşzamanlılık sınıfları Java 1.6'da tanıtıldı. Son zamanlarda biraz düzeltmek zorundaydım CircularByteBuffer Kullanılan kod, korunan bloklar yerine uyur. Önceki yöntemle, uygun eşzamanlılık sağlamanın bir yolu yoktu. Eğer iş parçacığının bir oyun olarak uyumasını istiyorsanız, çekirdek oyun döngüsünde belirli bir süre boyunca yürütmeyi duraklatmak mümkündür, böylece üstteki iş parçacıkları yürütmek için iyi bir süreye sahip olurlar. Thread.sleep(..) gayet iyi.


6
2017-10-18 03:56





Neden uyuduğuna ve ne sıklıkla çalıştırdığına bağlı.

Farklı durumlarda geçerli olabilecek çeşitli alternatifleri düşünebilirim:

  • İpin ölmesine ve daha sonra yeni bir başlangıç ​​yapmasına izin verin (iplik oluşturma çok pahalı olabilir)
  • Başka bir iş parçacığının ölmesini beklemek için Thread.join () öğesini kullanın.
  • Başka bir iş parçacığının çalışmasına izin vermek için Thread.yield () öğesini kullanın.
  • İş parçacığını çalıştırın, ancak daha düşük bir önceliğe ayarlayın
  • Wait () kullanın ve bildir ()

5
2017-10-18 04:06





http://www.jsresources.org/faq_performance.html

1.6. Thread.sleep () 'dan ne gibi bir hassasiyet bekleyebilirim?

Kısa uykulardaki temel problem, uyumaya çağrılmanın güncel zamanlama zaman dilimini bitirmesidir. Diğer tüm işlemler / işlemler bittikten sonra, çağrı geri dönebilir.

Sun JDK için, Thread.sleep (1) Windows'ta oldukça hassas olduğu bildirildi. Linux için, çekirdeğin zamanlayıcı kesintisine bağlıdır. Eğer çekirdek HZ = 1000 (alfa'daki varsayılan değer) ile derlenirse, hassasiyetin iyi olduğu bildirilir. HZ = 100 (x86'da varsayılan) için genellikle 20 ms'dir.

Thread.sleep (millis, nanos) kullanmak sonuçları iyileştirmez. Güneş JDK'sında nanosaniye değeri en yakın milisaniyeye yuvarlanır. (Matthias)


3
2017-09-21 05:23





niye ya? bağlam değişmesi nedeniyle (OS CPU zamanlamasının bir parçası)

Nasıl? Thread.sleep (t) çağrısı, geçerli iş parçacığının, çalışan sıradan bekleme sırasına taşınmasını sağlar. 'T' zamanına ulaştıktan sonra, o anki iş parçacığı bekleme sırasından hazır sıraya taşınır ve daha sonra CPU tarafından alınmak ve koşmak için biraz zaman alır.

Çözüm: Thread.sleep (t * 10) çağrısı; Thread.leep (t) 'i 10 iterasyon döngüsünde aramak yerine ...


2
2017-12-14 18:52





Asenkron işlemin bir sonuç döndürmesi için beklemeden önce bu sorunla karşılaştım.

Thread.sleep çoklu iş parçacığı senaryosunda bir sorundur. Uyuyakalmaya eğilimlidir. Bunun nedeni, dahili olarak önceliğini yeniden düzenlemesi ve diğer uzun süren işlemlere (iş parçacığı) vermesidir.

Yeni bir yaklaşım, ScheduledExecutorService arabirimini veya java 5'te ScheduledThreadPoolExecutor tanıtımı kullanıyor.

Referans: http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html


1
2017-09-01 16:36





Bu bir problem olmayabilir, buna bağlı.

Benim durumumda, Thread.sleep () işlevini, harici bir işleme yeniden giriş denemesinden önce birkaç saniye beklemek için kullanıyorum. Bu yeniden bağlantı mantığı için bir süre döngüsüm var. Benim durumumda, Thread.sleep () sadece zamanlama amaçlıdır ve çoktanıtmalar arasında koordine değil, bu mükemmel bir şey.

IDE'yi bu uyarının nasıl ele alınacağı konusunda yapılandırabilirsiniz.


1
2017-07-17 04:41





CountDownLatch sınıfına bakmanızı öneriyorum. Orada online olarak birkaç önemsiz örnek var. Çok iş parçacıklı programlamaya yeni başladığımda, "uyku süre döngü" kelimesinin yerini almak için sadece bir biletmişlerdi.


0
2017-10-19 03:24