2007-02-10
发个自己写的用来限制多个程序同时打开的类,欢迎大家拍砖
关键字: java
java为了跨平台,没有可以与操作系统进程打交道的api,所以要想限制多个应用程序打开,就得占用操作系统的某个特定资源,这个资源要符合这样的条件:就算程序不正常退出,也能自动被释放。符合这个条件的东西,或者说以我浅薄的java水平能操作的资源,就只有文件和端口了。下面是用端口作“山头”写的一个类:
用法:
java 代码
- protected boolean running;
- protected ServerSocket ss;
- protected int range;
- public ProgrameLock(int range)
- {
- this.range = range;
- }
- public boolean checklock(int port)
- {
- Socket s = new Socket();
- for (int i = 0; i <= range; i++)
- {
- try
- {
- s.connect(new InetSocketAddress("127.0.0.1", port + i));
- int len = s.getInputStream().available();
- if (len > 0)
- {
- byte tb[] = new byte[len];
- s.getInputStream().read(tb);
- String ts = new String(tb);
- if (ts.equals("Iamhere"))
- {
- return true;
- }
- }
- }
- catch (UnknownHostException e)
- {
- continue;
- }
- catch (IOException e)
- {
- continue;
- }
- }
- return false;
- }
- public void lock(int port)
- {
- OutputStream tos;
- try
- {
- ss = new ServerSocket(port);
- running = true;
- while (running)
- {
- try
- {
- Socket ts = ss.accept();
- tos = ts.getOutputStream();
- tos.write("Iamhere".getBytes());
- tos.flush();
- tos.close();
- }
- catch (IOException e)
- {
- }
- }
- }
- catch (IOException e)
- {
- if (port >= range)
- {
- return;
- }
- lock(port + 1);
- }
- }
- public void unlock()
- {
- running = false;
- try
- {
- ss.close();
- }
- catch (IOException e)
- {
- }
- }
java 代码
- final plock = new ProgrameLock(5);
新开一个线程,用lock方法占领桥头堡:
- new Thread(new Runnable()
- {
- public void run()
- {
- if (plock.checklock(5000)) //如果桥头堡已经被占领,就只好灰溜溜地退了
- {
- System.exit(0);
- }
- else
- {
- plock.lock(5000);
- }
- }
- }).start();
再来来一个使用文件锁的:
java 代码
- package src;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.RandomAccessFile;
- import java.net.ServerSocket;
- import java.nio.channels.FileChannel;
- import java.nio.channels.FileLock;
- import java.nio.channels.OverlappingFileLockException;
- public class FileProgrameLock
- {
- protected boolean running;
- protected ServerSocket ss;
- protected FileLock lock;
- public boolean checklock(String fileName) throws FileNotFoundException
- {
- File tf = new File(fileName);
- FileChannel channel = new RandomAccessFile(tf, "rw").getChannel();
- try
- {
- FileLock tl = channel.tryLock();
- if (tl == null)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- catch (OverlappingFileLockException e)
- {
- return true;
- }
- catch (IOException e)
- {
- return true;
- }
- }
- public boolean lock(String fileName) throws IOException
- {
- File tf = new File(fileName);
- FileChannel channel = new RandomAccessFile(tf, "rw").getChannel();
- try
- {
- lock = channel.lock();
- return true;
- }
- catch (OverlappingFileLockException e)
- {
- return false;
- }
- }
- public void unlock()
- {
- try
- {
- lock.release();
- }
- catch (IOException e)
- {
- }
- }
- }
欢迎大家抛砖,我顺便可以引引玉
发表评论
- 浏览: 7623 次

- 详细资料
搜索本博客
最新评论
-
spring mvc循序渐进(6)
辞职了,没时间写了
-- by aninfeel -
spring mvc循序渐进(6)
楼主继续后面的哈,测试那里有点没看懂
-- by gowhere -
javascript控制html dom
Dom.这是Dom规范要实现的东西. 不只Javascript, 在.net里操 ...
-- by 白发红颜 -
javascript控制html dom
像getElementById(),getElementsByTagName() ...
-- by just4you -
javascript控制html dom
w3cshcool办得不错,其文章言骇意简--当初学XML,用WEBZIP把整个 ...
-- by sp42






评论排行榜