2011-01-13 14 views
13

मेरे पास थ्रेडिंग के आसपास नियमों के समूह के साथ एक बहु-थ्रेडेड जावा प्रोग्राम है: उदाहरण के लिए, कक्षा ए में कोड केवल यूआई थ्रेड से ही बुलाया जाना चाहिए; कक्षा बी में 3 विधियों को केवल नेटवर्क थ्रेड से ही बुलाया जाना चाहिए, आदिआप कैसे जांचते हैं कि जावा में कौन सा थ्रेड कोड निष्पादित कर रहा है?

दावे या अन्य कोड जांच करने के तरीके पर कोई सुझाव है कि इन नियमों का पालन किया जा रहा है? मैं थ्रेड उपयोग पर कोडिंग त्रुटियों को रोकने के लिए "invariants" के परीक्षण के बराबर करना चाहता हूं। ।

उत्तर

12

adamfisk उत्तम सुझाव के अलावा, वहाँ भी के लिए एक सुविधा विधि है विशेष रूप से परीक्षण करना कि वर्तमान धागा ईडीटी धागा है:

EventQueue.isDispatchThread() 
+1

+1 - स्विंग लिखते समय, UI/NOT-UI प्रश्न आमतौर पर केवल एक ही महत्वपूर्ण है। – kdgregory

+1

धन्यवाद, मैं स्विंग का उपयोग नहीं कर रहा हूं लेकिन मुझे लगता है कि यह पढ़ने वाले बहुत से लोग होंगे। – Nils

16

Thread.currentThread() getName()

+0

+1 देखभाल: log4j या logback, बस %thread इस तरह सहित एक पैटर्न सेट? – Nils

1

मैं कक्षा एक में अपने कोड में इस तरह करना होगा:

if(!"UI thread".equals(Thread.currentThread().getName())){ 
    throw new IllegalStateException("wrong thread running this class, thread name:"+Thread.currentThread().getName()); 
} 
2

प्रश्न को बदलने पर विचार करें। प्रवर्तन के बजाय रोकथाम पर विचार करें।

यदि कक्षा मंगलर केवल यूआई थ्रेड में ही चलाया जा सकता है, तो Mangalor क्लास की UI कक्षाओं की दृश्यता सीमित करें। यदि क्लास CanOnString क्लास की बात() और सुनो() को केवल नेटवर्किंग थ्रेड में ही चलाना चाहिए, तो उन विधियों की दृश्यता को सीमित करें जिन्हें आप अपने नेटवर्किंग थ्रेड में चलाते हैं।

7

आप नाम का उपयोग कर के साथ

assert Thread.currentThread() == expectedThread; 

समस्या कोशिश कर सकते हैं कि धागे के किसी भी संख्या जैसे कि नाम का उपयोग कर सकते है यदि आप विशेष रूप से पागल हैं तो आप इस तरह के कोड के बारे में चिंता कर सकते हैं।

Thread.t = Thread.currentThread(); 
String name = t.getName(); 
t.setName("UI thread"); 
callUIThreadOnlyMethod(); 
t.setName(name); 
+0

क्या एक दुर्भावनापूर्ण कोडर के अलावा परिदृश्य हैं जहां इस प्रकार का अलियासिंग होता है? – Nils

+0

खराब थ्रेड नामकरण मानकों और प्रतिलिपि त्रुटियों। अधिकांश कार्यक्रमों को यह सुनिश्चित करने के लिए लिखा नहीं जाता है कि थ्रेड नाम अद्वितीय हैं और आप अक्सर डुप्लिकेट नाम देखते हैं। –

0

आप लॉगिंग का उपयोग करके थ्रेड नाम भी देख सकते हैं उदा। स्विंग मामले के लिए RD01 के जवाब के साथ अपने जवाब के दौर के लिए

<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 
    <root level="INFO"> 
    <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 
संबंधित मुद्दे

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