各位老大,小弟问一下,在java中写的单机版程序如何像金山词霸一样,每一个系统,同时只能有一个程序在跑??

解决方案 »

  1.   

    在你包含main()方法的类里加一个static 的变量用于记录启动个数的值,每启动一个加1,当个数大于一的时候就退出多余的
      

  2.   

    什么意思??
    是不是只能启动一个界面出来??
    如果是这样的话,就很简单
    public void showWin() {
      if (child.getState() == JFrame.ICONIFIED) {    
        child.setState(JFrame.NORMAL);
      }
      child.show();
    }
      

  3.   

    复人: cat_871017(零下九度) ( ) 信誉:100  2005-05-22 17:21:00  得分: 0  
     
     
       在你包含main()方法的类里加一个static 的变量用于记录启动个数的值,每启动一个加1,当个数大于一的时候就退出多余的
      
     兄弟,这个方法我试了!好像不行!在一个机器上边,如果我开两个命令行,都去执行,都可以.例子代码如下:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class B
    {
    public static void main(String[] args)
    {
    A a=A.getOnlyA();
    }
    }
    class A extends JFrame implements ActionListener
    {
    private static int count=0;
    private JButton ok=null;
    private A()
    {
    getContentPane().add(getOk());
    pack();
    //this.show;
    setVisible(true);
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    }
    public JButton getOk()
    {
    if(ok==null)
    {
    ok=new JButton("确定");
    ok.addActionListener(this);
    }
    return ok;
    }
    public void actionPerformed(ActionEvent e)
    {
    Object obj=e.getSource();
    if(obj==this.getOk())
    {
    count--;
    System.exit(0);
    }
    }
    public static A getOnlyA()
    {
    A one=null;
    if(count<1)
    {
    one=new A();
    }
    return one;
    }
    }
      

  4.   

    zhaohao19853(贱人) 
      兄弟,我不知道这样称呼是否合适,但是我想回答你,我照着你得想法写了代码,不知道是否正确,你看看!但是结果不是我要得!代码如下:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class B
    {
    public static void main(String[] args)
    {
    A a=A.getOnlyA();
    }
    }
    class A extends JFrame implements ActionListener
    {
    private static int count=0;
    private JButton ok=null;
    private A()
    {
    getContentPane().add(getOk());
    pack();
    //this.show;
    setVisible(true);
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    }
    public JButton getOk()
    {
    if(ok==null)
    {
    ok=new JButton("确定");
    ok.addActionListener(this);
    }
    return ok;
    }
    public void actionPerformed(ActionEvent e)
    {
    Object obj=e.getSource();
    if(obj==this.getOk())
    {
    count--;
    System.exit(0);
    }
    }
    public static A getOnlyA()
    {
    A one=null;
    if(count<1)
    {
    one=new A();
    if (one.getState() == JFrame.ICONIFIED) 
    {    
         one.setState(JFrame.NORMAL);
       }
    }
    return one;
    }
    }我是这样运行得,首先开启一个命令窗口,运行它,没有什么问题,然后在不关闭第一个得同时,又开启另一个命令窗口,同样可以运行,此时,在我得机器上有两个同样得程序在跑,这是我不像看见得!不知道我得意思你是否明白!谢谢回复~
      

  5.   

    java只能线程同步,不能进程同步
    办法好像有
    1. 检测端口,程序起来之后,邦定到一个特定端口
    2.锁定文件 FileChannel
    其他的方法,我就不知道了
      

  6.   

    最好用JNI方法。
    检测端口的话,要实现通信才行。检查某一个(或一组)端口。端口未占用,
    或者端口被使用却没有应答才行。否则已经启动的程序异常后,不杀进程就再也启动不起来了
      

  7.   

    import java.awt.BorderLayout;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;public class FileLockTest {
        public static void main(String[] args) throws IOException {
            File lockFile = new File(System.getProperty("user.home"), ".mylock");
            FileOutputStream fos = new FileOutputStream(lockFile, true);
            FileChannel chanel = fos.getChannel();
            FileLock lock = chanel.tryLock();
            if (lock == null) {
                JOptionPane.showMessageDialog(null, "程序已经启动!");
                System.exit(0);
            }
            
            JFrame f = new JFrame();
            f.getContentPane().add(new JLabel("Started", JLabel.CENTER), 
                    BorderLayout.CENTER);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(400, 300);
            f.setLocationRelativeTo(null);
            f.show();
        }
    }
      

  8.   

    gtlang78()
     兄弟,我的目的达到了,效果很不错,能不能给讲解一下啊!麻烦你了!
      

  9.   

    你去看看FileChannel类的 tryLock()方法的文档吧,简单的说就是尝试在同一个文件上加锁,如果成功了就返回一个FileLock对象,如果别的进程已经在这个文件上加过锁了,这个方法就返回null
      

  10.   

    谢谢 gtlang78() 
      前边的兄弟,不是说还有检查端口号的方法嘛??
     怎么搞??
    再说说我就结贴!!!
      

  11.   

    学到有用的东西了,谢谢gtlang78!
    检查端口的方法又如何实现?
      

  12.   

    检查端口的方法好像不如FileLock的方法保险,如果别的程序占用了指定的端口,这个程序就没法启动了import java.awt.BorderLayout;
    import java.io.IOException;
    import java.net.BindException;
    import java.net.ServerSocket;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;public class PortBindTest {
        public static void main(String[] args) throws IOException {
            try {
                ServerSocket ss = new ServerSocket(5678);
            } catch (BindException e) {
                JOptionPane.showMessageDialog(null, "程序已经启动!");
                System.exit(0);
            }        JFrame f = new JFrame();
            f.getContentPane().add(new JLabel("Started", JLabel.CENTER),
                    BorderLayout.CENTER);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(400, 300);
            f.setLocationRelativeTo(null);
            f.show();
        }
    }