2010-05-18 26 views
5

मेरे पास BufferedImage उदाहरण, एक मुख्य छवि और कुछ छवियां हैं जो मुख्य छवि पर getSubImage पर कॉल करके बनाई गई हैं। उपनिवेश ओवरलैप नहीं करते हैं। मैं उपनिवेश में संशोधन भी कर रहा हूं और मैं इसे प्रति थ्रेम्स में एक से अधिक थ्रेड में विभाजित करना चाहता हूं।अलग-अलग धागे में BufferedImage के अलग-अलग क्षेत्रों को अपडेट करने के लिए सुरक्षित?

  • BufferedImage से प्रत्येक उदाहरण (और अपने संबंधित WritableRaster और SampleModel) केवल एक ही धागे से पहुँचा जा सकता है:

    कैसे BufferedImage, Raster और DataBuffer काम करते हैं, इस सुरक्षित होना चाहिए की मेरी समझ क्योंकि से

  • साझा ColorModel अपरिवर्तनीय है
  • DataBuffer कोई फ़ील्ड कि संशोधित किया जा सकता है (केवल बात यह है कि बदल सकते हैं समर्थन सरणी के तत्वों है।)
  • अलग धागे में एक सरणी के संबंध तोड़ना खंडों में संशोधन करना सुरक्षित है।

हालांकि मुझे दस्तावेज़ में कुछ भी नहीं मिला है जो कहता है कि यह करना निश्चित रूप से सुरक्षित है। क्या मुझे लगता है कि यह सुरक्षित है? मुझे पता है कि बच्चे Raster एस की प्रतियों पर काम करना संभव है लेकिन मैं स्मृति बाधाओं के कारण इसे टालना पसंद करूंगा।

अन्यथा, क्या मूल छवि के क्षेत्रों की प्रतिलिपि किए बिना ऑपरेशन थ्रेड-सुरक्षित बनाना संभव है?

उत्तर

4

आप जय टाइल्स के रूप में अपने 'subimages' प्रबंधन करने के लिए का उपयोग कर में देखा है? यह संसाधनों के बेहतर उपयोग की तरह प्रतीत होता है यदि आपको मूल छवि BufferedImage इंस्टेंस के साथ-साथ इसके सभी सब इमेज BufferedImage इंस्टेंस पर लटका नहीं है। जय के बारे में जानकारी यहां पाया जा सकता: JAI README

नहीं है एक वर्ग है, TiledImage, जो RenderedImage इंटरफेस (यह BufferedImage के साथ एक आम पूर्वज दे रही है) लागू करता है। जय प्रलेखन के अनुसार:

खपरैल का प्रयोग भी गणना के लिए एक से अधिक थ्रेड के उपयोग की सुविधा। पहले 0 आवंटित टाइल्स का उपयोग स्मृति को सहेजने के लिए भी किया जा सकता है।

RenderedImage की इन कार्यान्वयन में से एक का उपयोग के बाद से BufferedImage पूरी छवि के लिए स्मृति में एक छवि स्नैपशॉट का कहना है, वैसे भी अक्सर एक BufferedImage को preferrable है।जेएई एक प्रतिपादन श्रृंखला का उपयोग करता है और स्मृति बाधाओं को फिट करने के लिए आवश्यक टाइल रीसायकल कर सकता है।

1

मैं BufferedImage का धागा सुरक्षा के किसी भी स्पष्ट सबूत नहीं मिला है, लेकिन आप शायद आपकी समस्या को अगले रास्ता हल कर सकते हैं:

इसके बजाय विभिन्न कार्यकर्ताओं द्वारा subimages के एक साथ प्रसंस्करण की, में कई छवियों संसाधित करने का प्रयास जिस तरह से प्रत्येक कर्मचारी एक ही छवि के विभिन्न उपनिवेशों का उपभोग करता है। वही कार्यकर्ता एक ही छवि के उपखंडों को संसाधित करेगा, लेकिन अनुक्रमिक रूप से।

श्रमिकों की तुलना में कम छवियां होने तक आपके कर्मचारी व्यस्त रहेंगे।

रिवर्ट इस समस्या:

 
     W1  W2  W3 
Img1 |-------|-------|-------| 
     W1  W2  W3 
Img2 |-------|-------|-------| 
करने के लिए:

 
     W1  W1  W1 
Img1 |-------|-------|-------| 
     W2  W2  W2 
Img2 |-------|-------|-------| 
+0

फिर छवि को विभाजित करने का कोई फायदा नहीं है। – finnw

+0

मैं विलंबता को कम रखने के लिए एकाधिक थ्रेड में एक छवि के सबमिटेज को प्रोसेस करना जारी रखना पसंद करूंगा। यहां तक ​​कि अगर यह पता चला है कि इसे उपनिवेशों की प्रतिलिपि बनाना आवश्यक है। – finnw

2

यह एक अच्छा विश्लेषण है, और यह मेरे लिए सही लगता है। कोई साझा डेटा नहीं है, इसलिए समवर्ती पहुंच ठीक होनी चाहिए। हालांकि, आपको यह सुनिश्चित करने के लिए किसी प्रकार की गारंटी की आवश्यकता है, एक शिक्षित अनुमान से अधिक कि इसे काम करना चाहिए। यहां तक ​​कि यदि आपको एक बयान मिलता है कि "BufferedImage को समवर्ती रूप से उपयोग करने के लिए डिज़ाइन किया गया है" - इस बात की कोई गारंटी नहीं है कि यह अभ्यास में है।

यह सुनिश्चित करने के लिए कि आप हो सकते हैं, आप ConTest का उपयोग कर एक समवर्ती इकाई परीक्षण लिख सकते हैं। समवर्ती परीक्षण दोहन आपके कोड को नियंत्रित करता है और कृत्रिम रूप से प्रेरित संदर्भ इंजेक्ट करता है जो समवर्ती बग का पर्दाफाश करने के लिए स्विच करता है। यह BufferedImage कोड और अपना स्वयं का कोड परीक्षण करेगा, इसलिए आपको उच्च आत्मविश्वास हो सकता है कि यह थ्रेड सुरक्षित है।

0

यदि इनमें से कोई भी जवाब संतुष्ट नहीं है (पर्याप्त) आप ऐसा कुछ कर सकते हैं जो निश्चित रूप से भारी (?) कीमत पर प्रश्न को व्यवस्थित करेगा।

Examine the source for BufferedImage, DataBuffer, Raster, etc. यह एकमात्र तरीका है।

+0

मैंने पहले से ही ऐसा किया है, लेकिन एक कार्यान्वयन पर सुरक्षित होने का मतलब यह नहीं है कि यह दूसरे पर सुरक्षित रहेगा। – finnw

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