Java-java 共享内存的问题

发布于 2017-01-24 11:45:47 字数 2915 浏览 1142 评论 4

在《操作系统概念》一书中看到的例子, 用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瑾兮 2017-10-18 02:07:54

上面main代码的主要问题在于
1、执行了 run() 而不是 start()

泛泛之交 2017-08-05 16:50:37

不可能的,Java中是没有进程间共享内存一说的,严重怀疑哪本书上这样写的。。。

泛泛之交 2017-04-20 01:13:01

java唯一能用的共享内存的类是MappedByteBuffer,可以多进程间共享内存~

如果想用更高级的共享内存需要使用Terracotta~

偏爱自由 2017-03-28 20:28:43

在所有死循环的地方就了一句

 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文