java 多进程并发控制怎么做?

来源:百度知道 编辑:UC知道 时间:2024/06/23 05:16:36
如题。

a.class在执行时如何保证a.class不能再被当成新进程执行?
a.class在执行时如何在其他进程运行a.class时开启一个线程来完成另一个进程的任务,却不新建进程?
我知道利用读写文件和剪贴板可以,但是这样做负面影响太大,并且达不到我做这个东西的目的。

其实这就是一个进程间通信的问题。

bearfig谢谢你,但是你的回答是针对线程的。对我很有帮助但是不能解决眼前的问题。

进程间的通讯无非就是读写文件,socket通讯或者使用共享内存。

你不想用读写文件的方式,那就用共享内存或者socket通讯的方式。我个人觉得用socket比较简单,也许是因为我对socket比较熟悉。

下面是一篇java实现共享内存的文章,java没法管理内存,其实他也是靠创建映像文件来实现的。

共享内存在java中的实现
在jdk1.4中提供的类MappedByteBuffer为我们实现共享内存提供了较好的方法。该缓冲区实际上是一个磁盘文件的内存映像。二者的变化将保持同步,即内存数据发生变化会立刻反映到磁盘文件中,这样会有效的保证共享内存的实现。
将共享内存和磁盘文件建立联系的是文件通道类:FileChannel。该类的加入是JDK为了统一对外部设备(文件、网络接口等)的访问方法,并且加强了多线程对同一文件进行存取的安全性。例如读写操作统一成read和write。这里只是用它来建立共享内存用,它建立了共享内存和磁盘文件之间的一个通道。
打开一个文件建立一个文件通道可以用RandomAccessFile类中的方法getChannel。该方法将直接返回一个文件通道。该文件通道由于对应的文件设为随机存取文件,一方面可以进行读写两种操作,另一方面使用它不会破坏映像文件的内容(如果用FileOutputStream直接打开一个映像文件会将该文件的大小置为0,当然数据会全部丢失)。这里,如果用 FileOutputStream和FileInputStream则不能理想的实现共享内存的要求,因为这两个类同时实现自由的读写操作要困难得多。
下面的代码实现了如上功能,它的作用类似UNIX系统中的mmap函数。
// 获得一个只读的随机存取文件对象
RandomAccessFile RAFile = new RandomAccessFile(filename,"r");
// 获得相应的文件通道
FileChannel fc = RAFile.getChannel();
// 取得文件的实际大小,以便映像到共享内存
int size = (int)fc.size();