Java-java 共享内存的问题
在《操作系统概念》一书中看到的例子, 用java语言模拟共享内存。
下面是一个BoundedBuffer类,书上说“可以通过让生产者进程和消费者进程共享BoundedBuffer类的实例来实现模拟目的。 但是 怎么才能让两个进程共享一个实例呢? 我试了一下Thread不行啊。
package bit.donkey.OS;
public interface Buffer {
public abstract void insert(int item);
public abstract int remove();
}
///////////////////////////////////////////////////////////////
package bit.donkey.OS;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import static cn.edu.bit.donkey.MyPrint.*;
public class BoundedBuffer implements Buffer{
//公共内存区
private static final int BUFFER_SIZE = 5;
private int count; // 记录buffer数组中,数据总数
private int in; //队列首,
private int out; // 队列尾
private int[] buffer;
// 初始化内存
public BoundedBuffer() {
count = in = out = 0;
buffer = new int[BUFFER_SIZE];
}
@Override
//想buffer队列插入一个数据
public void insert(int item) {
// TODO Auto-generated method stub
while(count == BUFFER_SIZE);
++ count;
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
}
@Override
//从buffer队列移除一个数据
public int remove() {
// TODO Auto-generated method stub
int item;
while(count == 0);
-- count;
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
return item;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputStreamReader stdin = new InputStreamReader(System.in);
BufferedReader bfr = new BufferedReader(stdin);
final BoundedBuffer bbf = new BoundedBuffer();
Runnable PRun = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int n = 0;
println("in P");
bbf.insert(n++);
}
};
Runnable CRun = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int n = 0;
println("in C");
println(bbf.remove());
}
};
// 用两个线程共享实例
Thread C = new Thread(CRun);
Thread P = new Thread(PRun);
while(true) {
switch(bfr.readLine().charAt(0)){
case 'C' :
C.run();
break;
case 'P' :
P.run();
break;
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
上面main代码的主要问题在于
1、执行了 run() 而不是 start()
不可能的,Java中是没有进程间共享内存一说的,严重怀疑哪本书上这样写的。。。
java唯一能用的共享内存的类是MappedByteBuffer,可以多进程间共享内存~
如果想用更高级的共享内存需要使用Terracotta~
在所有死循环的地方就了一句
TimeUnit.MILLISECONDS.sleep(1);
这样就不会卡死了, 但是每次P和C都是交替执行的, 结果是
in C
in P
0
in C
in P
1
in C
in P
2
in C
in P
3