Java Thread Kullanımı Hakkında

Programlama16/03/2011


Eger actionPerformed metodunun icinde kullanici yüzeyinde herhangi bir degişiklik yapiyorsaniz, actionPerformed metodu bitene kadar yüzey kendini güncellemez. For döngüsü actionPerformed'in icindeyse ya da icinde oldugu metod actionPerformed'dan cagriliyorsa yine ayni şekilde güncelleme olmaz. Bunu yapabilmenin tek caresi thread'lerle calişmaktir. Gecen günkü arkadaşa da söylemiştim. Java görsel makinasinin icinde AWT-Thread denilen bir thread var, bu AWT-Thread Java sisteminin bir parcasi ve actionPerformed metodundan sorumlu. Bu AWT-Thread aktif oldugu sürece grafiksel yüzeyleri bloke eder, yani bizim actionPerformed metodumuz bitene kadar grafiksel yüzey bloke edilir.

Bunun icin en iyi yol actionPerformed'a bastiginizda sadece o işle ilgilenecek bir thread ba$latmaktir. Bu threadi new ile örneklerken ona bir Runnable nesnesi vermemiz gerekir. Bu Runnable'in icindeki run metodu thread tarafindan uygulamaya koyulur. Dolayisiyle ben bu bilgiler dogrultusunda aşagida bir örnek yazdim. Bu örnekte Runnable nesnesinin icindeki run metodunda label'in güncellenmesini sagliyorum. Bir threadi bir kere kullandiktan sonra bir daha kullanamadigimiz icin her butona basildiginda yeni bir thread yaratiyorum. Burada sure (süre) diye bir degişken tanimladim, bu o anki saniyeyi gösteriyor. Buna ihtiyac duymamizin sebebi bir thread calisiyorken ( yani sure > 0) başka threadin başlamasina engel olmak, yoksa jlabel her tiklamada yaratilan yeni threadler icin deger gösterir, 1den 20ye kadar bir sürü degeri karman corman görürüz.

Kodu incelerseniz size yardimci olur umarim:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class OrnekFrame implements ActionListener
{
    private JFrame frame;
    private JPanel panel;
    private JLabel label;
    private JButton buttonSaydir;
    private int sure;
    
    private Runnable threade_verilecek_runnable_nesnesi;
    
    public OrnekFrame()
    {
        frame = new JFrame("Labeli 20ye kadar saniye saniye say");
        panel = new JPanel();
        label = new JLabel("burada sayacak");
        buttonSaydir = new JButton("Sayimi baslatmak icin tiklayin");
        
        buttonSaydir.addActionListener(this);
        
        panel.setLayout(new BorderLayout());
        panel.add(BorderLayout.CENTER, label);
        panel.add(BorderLayout.SOUTH, buttonSaydir);        
        
        frame.setVisible(true);
        frame.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        frame.setSize(400,300);
        frame.getContentPane().add(panel);
        
        threade_verilecek_runnable_nesnesi = new Runnable()
        {
            int k;
            @Override
            public void run()
            {
                for (k=1; k<=20; k++)
                {
                    sure = k;
                    label.setText(String.valueOf(sure));
                    try
                    {
                        Thread.sleep(1000);
                    }
                    catch (InterruptedException exception)
                    {
                        exception.printStackTrace();
                    }
                    panel.revalidate();
                    panel.repaint();
                }
                sure = 0;
            }
        };
        
    }
    
    @Override
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == buttonSaydir)
        {
            if (sure == 0)
                new Thread(threade_verilecek_runnable_nesnesi).start();
        }
        
    }
    
    public static void main(String[] args)
    {
        new OrnekFrame();
    }

}

Etiketler: