Uygulamamızın sadece bir örneği çalışsın

Programının sadece bir kez çalışmasını isteyen biri java_tr grubuna bunu nasıl yapacağını sordu. Bende merak ettim acaba programın nasıl sadece tek bir örneği çalışır diye araştırdım.
Bu iş için iki yöntem öneriliyor. Birinci yöntem geçici bir dosyayı bir yerde yaratmak ve her program açılışında böyle bir dosya var mı diye kontrol etmek. Ancak bu yöntemin handikapı uygulama çöktüğü zaman veya herhangi bir şekilde program kapanınca dosya silinmediğinde program sürekli dosya ile karşılaşacağı için bir türlü çalışmayacaktır.
İkinci yöntemde java.net.ServerSocket sınıfından yararlanıyoruz. Buradaki ana fikir bir port açmaktan geçiyor. Program açıldığı zaman bir port açıyor, ve açmaya çalışırken java.net.BindException atılırsa programın hali hazırda çalıştığını anlıyoruz. Bunun da handikapı kullanılan portun başka programlar tarafından kullanılabilir olmasıdır. Bunu çok saçma bir port sayısı ile aşabiliriz. Bu yöntemi beğendim, denemeye karar verdim.

Aşağıdaki sınıf bu yöntemi denemeyi göstermektedir. Görüldüğü gibi ana metodta port açılmaya çalışılarak kontrol yapılmaktadır. Ben her ne kadar Java ile yaptıysam da diğer programlama dillerinde de uygun yapılarla rahatlıkla gerçekleştirilebilir.
import java.awt.BorderLayout;

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

public class AnaSinif extends JFrame {


//Herhangi bir program tarafindan kullanilmayan bir port kullanalim
private static final int RUN_PORT = 9666;

private JPanel jContentPane = null;

private JLabel jLabel = null;

/**
* This is the default constructor
*/
public AnaSinif() {
super();
initialize();
}

/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("Tek Örnek");
this.setVisible(true);
}

/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jLabel = new JLabel();
jLabel.setText("Bu sınıfın sadece bir örneği çalışır.");
jLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
jLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(jLabel, java.awt.BorderLayout.CENTER);
}
return jContentPane;
}

public static void main(String[] args) {
try {
new java.net.ServerSocket(RUN_PORT);
} catch (java.net.BindException ex) {
JOptionPane.showMessageDialog(null,"Bu programın bir örneği çalışmakta!");
System.exit(1);
} catch (java.io.IOException ex) {
ex.printStackTrace();
System.exit(1);
}
new AnaSinif();
}
}

Ben ihtiyacım olduğu zaman bu yöntemi kullanacağım. Daha iyi yöntemler bulduğum zaman burada onlarıda paylaşmaya çalışacağım. Sizde bildiğiniz yöntemleri yorumlarınızla paylaşın.

Kaynak: http://www.devx.com/tips/Tip/13745

Hiç yorum yok: