/ / क्या यह सरल स्विंग-आधारित वर्ग थ्रेड-सुरक्षित है? - जावा, स्विंग, थ्रेड-सुरक्षा

क्या यह सरल स्विंग-आधारित वर्ग थ्रेड-सुरक्षित है? - जावा, स्विंग, थ्रेड-सुरक्षा

मैं जावा में एक सबूत-ऑफ-अवधारणा खेल बना रहा हूं औरथ्रेड-सुरक्षित डबल बफरिंग के साथ अपना स्वयं का सरल घटक बनाने के लिए (अभ्यास के लिए लेकिन ज्यादातर मज़े के लिए) निर्णय लिया। हालांकि, जब मैं समेकन (विशेष रूप से स्विंग के संबंध में) की बात आती हूं तो मुझे बहुत अनुभवी नहीं होता है और मैं सोच रहा हूं कि मेरे कार्यान्वयन के साथ कोई समस्या है या नहीं।

निम्नानुसार कार्यान्वयन:

import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class GamePanel extends JPanel
{

private static final long serialVersionUID = 1L;

private BufferedImage mBackImage = null;
private BufferedImage mFrontImage = null;

public BufferedImage getBackImage ()
{
return mBackImage;
}

public void swap ()
{
BufferedImage new_back;
//
synchronized (this)
{
new_back = mFrontImage;
mFrontImage = mBackImage;
}
//
int width = getWidth (), height = getHeight ();
if (width > 0 && height > 0)
{
if (new_back == null || new_back.getWidth () != width
|| new_back.getHeight () != height)
new_back = new BufferedImage (width, height,
BufferedImage.TYPE_INT_ARGB);
//
mBackImage = new_back;
}
else
mBackImage = null;
}

@Override
public void paintComponent (Graphics g)
{
synchronized (this)
{
if (mFrontImage == null)
super.paintComponent (g);
else
g.drawImage (mFrontImage, 0, 0, null);
}
}

}

मैं यह मान रहा हूँ getBackImage() तथा swap() केवल एक धागे (गेम लूप थ्रेड) द्वारा बुलाया जाएगा। पेंट्स स्विंग टाइमर के माध्यम से ट्रिगर होते हैं और इसलिए ईडीटी में होते हैं। मेरा मानना ​​है कि उपयोग के आसपास सरल सिंक्रनाइज़-ब्लॉक mFrontImage अवांछित व्यवहार से बचाने के लिए पर्याप्त होना चाहिए, जिससे खेल लूप थ्रेड को पीछे की छवि में प्रस्तुत करने और स्विंग रेड्रा के बारे में चिंता किए बिना स्वैप कॉल करने की अनुमति मिलती है। क्या मैं कुछ भूल रहा हूँ?

उत्तर:

उत्तर № 1 के लिए 1

खेल धागे में:

BufferedImage image = gamePanel.getBackPanel();
gamePanel.swap();

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

पढ़ने और लिखने के प्रयोजनों के लिएफ्रंट इमेज फ़ील्ड अपने आप पर "थ्रेड सुरक्षित है क्योंकि सभी एक्सेस सिंक्रनाइज़ किए गए ब्लॉक के अंदर की जाती है। हालांकि, सिंक्रनाइज़ ब्लॉक में बिताए गए समय को कम करने के लिए पेंट कॉम्पोनेंट विधि बेहतर लिखी जा सकती है। यह है:

@Override
public void paintComponent (Graphics g)
{
BufferedImage localFrontImage;
synchronized (this)
{
localFrontImage = mFrontImage;
}
if (localFrontImage == null)
super.paintComponent (g);
else
g.drawImage (localFrontImage, 0, 0, null);

}

उत्तर № 2 के लिए 1
  • स्विंग शुद्ध सिंगल थ्रेडेड है और सभी घटना ईडीटी पर की जानी चाहिए, फिर मैं कारण नहीं देख सकता synchronized (this)

  • उपयोग चिह्न में JLabel विवाद के लिए स्विंग जीयूआई में छवियां

  • किसी के लिए swap"s types, आपने देखा है CardLayout