2012-07-02 6 views
20

मुझे जावा पर Thread.sleep() के साथ एक अजीब त्रुटि है। किसी कारण से, जब मैं कुछ मशीनों पर नींद कहता हूं, तो यह कभी वापस नहीं आता है। मैं यह नहीं समझ सकता कि इस व्यवहार के कारण क्या हो सकता है। सबसे पहले, मैं thgouth त्रुटि कहीं और मेरी कोड में हो सकता है, तो मैं सबसे सरल संभव नींद परीक्षण किया:Thread.sleep() कभी वापस

public class SleepTest { 
    public static void main (String [] args) { 
     System.out.println ("Before sleep..."); 
     try { 
      Thread.sleep (100); 
     } catch (InterruptedException e) { 
     } 
     System.out.println ("After sleep..."); 
    } 
} 

सबसे मशीनों पर यह काम करता है, लेकिन कई मशीनों जो मैं दूर से में प्रवेश करने कर रहा हूँ, यह अनिश्चित काल के लिए रुक जाता है प्रिंट स्टेटमेंट के बीच। मैंने व्यवहार में कोई बदलाव नहीं होने के साथ आधे घंटे तक इंतजार किया है। मशीनें जो इस त्रुटि को प्रदर्शित कर रही हैं वे लिनक्स मशीन हैं। मशीनों के बारे में कुछ जानकारी यहां दी गई है:

$ uname -a 
Linux zone29ea 2.6.32-220.17.1.el6.x86_64 #1 SMP Tue May 15 17:16:46 CDT 2012 x86_64 x86_64 x86_64 GNU/Linux 
$ java -version 
java version "1.6.0_22" 
OpenJDK Runtime Environment (IcedTea6 1.10.6) (rhel-1.43.1.10.6.el6_2-x86_64) 
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 

इस व्यवहार के कारण क्या हो सकता है?

अद्यतन

संशोधित संस्करण है, जो अभी भी कभी नहीं समाप्त होता है:

public class SleepTest { 
    public static void main (String [] args) { 
     new Thread() { 
      public void run() { 
       System.out.println ("Before sleep..."); 
       try { 
        Thread.sleep (100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println ("After sleep..."); 
      } 
     }.start(); 
    } 
} 
+2

आप अगर वहाँ अपनी पकड़ के अंदर निकाल दिया गलती से हुआ है की जाँच की थी तय? शायद एक प्रिंटस्टैकट्रेस? –

+0

क्या आप यह सुनिश्चित करने के लिए एक अलग थ्रेड में कोशिश कर सकते हैं कि अभी भी ऐसा होता है? आप जो कर रहे हैं वह मुख्य धागे को सोने के लिए डालने वाला है जो –

+1

समस्या का कारण बन सकता है क्या आप सुनिश्चित हैं कि समस्या दूसरी println के पुनर्भुगतान में नहीं है (जैसा कि आप इसे दूरस्थ रूप से करते हैं)? शायद एक लापता फ्लश? 'थ्रेड.sleep (100); 'लिनक्स पर भी काम करता है। –

उत्तर

13

यदि आपके सर्वर लिनक्स के तहत चल रहा है, तो आप Leap Second bug जो पिछले सप्ताह के अंत में दिखाई देता है ने टक्कर मार दी जा सकती है।

यह बग लिनक्स कर्नेल (थ्रेड प्रबंधन) को प्रभावित करता है, इसलिए अनुप्रयोग जो थ्रेड का उपयोग करता है (जैसा कि JVM, mysql आदि ...) CPU का उच्च भार उपभोग कर सकता है।

+0

नहीं, लीप दूसरा जून के अंतिम दिन के आखिरी घंटे के आखिरी मिनट में जोड़ा गया था। लेकिन आपके सर्वर की एनटीपी प्रक्रिया में कोई समस्या हो सकती है। रीबूटिंग समस्या को हल कर सकती है। –

+0

मैं इसे देख लूंगा। त्रुटि 1 जुलाई के बाद शुरू हुई और ये मशीनें एनटीपी का उपयोग करती हैं। – 101100

+0

तो बग वास्तव में एक अच्छा उम्मीदवार है। सर्वर को रीबूट करने से आपकी समस्या हल होनी चाहिए। –

3

अपने सर्वर एनटीपी का उपयोग करता है (आप उल्लेख किया) और अपने CPU उपयोग 100% करने के लिए चला जाता है, अपने dmesg: में Clock: inserting leap second 23:59:60 UTC के लिए जाँच, यदि आप पाते हैं कि, आप सुनिश्चित करें कि आपके सर्वर Leap Second bug से प्रभावित कर रहे हैं, दुर्भाग्य से जावा में से एक है जो सबसे अधिक प्रभावित है।

इसे हल करने के लिए, किसी भी सर्वर (जैसे, tomcat) को पुनरारंभ करने के साथ निम्न आदेश चलाएं।

/etc/init.d/ntp stop 
date `date +"%m%d%H%M%C%y.%S"` 

आशा .. इस में मदद करता है

+0

दुर्भाग्यवश, मेरे पास इस समाधान को आजमाने के लिए रूट पहुंच नहीं थी। – 101100

1

यह छलांग दूसरे से संबंधित होने लगते है।

https://lkml.org/lkml/2012/7/1/19 से कम से एक पोस्ट के आधार पर, मैंने किया था:

date -s "`date`" 

और यह मेरे लिए समस्या

संबंधित मुद्दे