一道关于生产者与消费的线程同步

xytmbj72d 2009-11-17 11:03:28
加精
本程序如何修改才能达到下面的效果:
生产的新数据是:1
读到的数据是:1
生产的新数据是:2
读到的数据是:2
生产的新数据是:3
读到的数据是:3
生产的新数据是:4
读到的数据是:4

源文件:
package 多线程;
//生产者与消费者的同步问题 。生产者放入一个整数到共享区中,仅当消费者取走后才能继续放入
class HoldInt{
private int sharedInt; //共享区只能存入一个数
private boolean writeAble = true;//表示生产者能生产新数据
public synchronized void set(int val){ //对临界区的写操作
while(!writeAble){ //进入等待
try{
wait();
}catch(InterruptedException e){}
}
sharedInt = val;
writeAble = false; //表示生产者不能放入数据
notify();//唤醒消费者
}

public synchronized int get(){ //对临界区的读操作
while(writeAble){
try{
wait();
}catch(InterruptedException e){}
}
writeAble = true;
notify();//唤醒生产者
return sharedInt;
}
}
//生产者线程
class ProduceInt extends Thread{
private HoldInt hi;
public ProduceInt(HoldInt hiForm){
hi = hiForm;
}

public void run(){
for(int i=1;i<=4;i++){
hi.set(i);
System.out.println("生产的新数据是:"+i);
}
}
}
//消费者线程
class ConsumeInt extends Thread{
private HoldInt hi;
public ConsumeInt(HoldInt hiForm){
hi = hiForm;
}
public void run(){
for(int i=1;i<=4;i++){
int val = hi.get();
System.out.println("读到的数据是:"+val);
}
}
}

public class Productor_Consumer {
public static void main(String[] args){
HoldInt h = new HoldInt();//h为监控器
ProduceInt p = new ProduceInt(h);
ConsumeInt c = new ConsumeInt(h);
p.start();
c.start();
}
}
...全文
1215 49 打赏 收藏 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
asd16 2009-11-25
  • 打赏
  • 举报
回复
ddddddd
asd16 2009-11-25
  • 打赏
  • 举报
回复
回复37楼
你写的程序没问题啊 !怎么没有对打印的顺序进行同步啊,不是已经synchronized了吗
teacher1998 2009-11-23
  • 打赏
  • 举报
回复
记号
ziyaer 2009-11-23
  • 打赏
  • 举报
回复
学习一下哦 很好
shaonew 2009-11-23
  • 打赏
  • 举报
回复
学习中
fengluoyan 2009-11-22
  • 打赏
  • 举报
回复
好深奥哦~~
voiceofme 2009-11-22
  • 打赏
  • 举报
回复
学操作系统中重点讲的就是这些东西
pywepe 2009-11-22
  • 打赏
  • 举报
回复
而不用 mutex 和 semphore(好像是这样写)
pywepe 2009-11-22
  • 打赏
  • 举报
回复


大家说是不是java设计的好

就是一synchronized 加Object的wait notify 就可以实现线程同步 互斥

asd16 2009-11-22
  • 打赏
  • 举报
回复
过来学习学习
keke_2 2009-11-22
  • 打赏
  • 举报
回复
我们最近也在做这个实验 给了我一个很好的参考
Yw7878 2009-11-22
  • 打赏
  • 举报
回复
加油
··好好学习多线程···
一线coder 2009-11-21
  • 打赏
  • 举报
回复
good
zhuaijun999 2009-11-21
  • 打赏
  • 举报
回复
//生产者与消费者的同步问题 。生产者放入一个整数到共享区中,仅当消费者取走后才能继续放入
class HoldInt{
private int sharedInt; //共享区只能存入一个数
private boolean writeAble = true;//表示生产者能生产新数据
public synchronized void set(int val){ //对临界区的写操作
while(!writeAble){ //进入等待
try{
wait();
}catch(InterruptedException e){}
}
sharedInt = val;
System.out.println("生产的新数据是:"+sharedInt);
writeAble = false; //表示生产者不能放入数据
notify();//唤醒消费者
}

public synchronized void get(){ //对临界区的读操作
while(writeAble){
try{
wait();
}catch(InterruptedException e){}
}
System.out.println("消费储的新数据是:"+sharedInt);
writeAble = true;
notify();//唤醒生产者
}
}
//生产者线程
class ProduceInt extends Thread{
private HoldInt hi;
public ProduceInt(HoldInt hiForm){
hi = hiForm;
}

public void run(){
for(int i=1;i <=4;i++){
hi.set(i);
}
}
}
//消费者线程
class ConsumeInt extends Thread{
private HoldInt hi;
public ConsumeInt(HoldInt hiForm){
hi = hiForm;
}
public void run(){
for(int i=1;i <=4;i++){
hi.get();
}
}
}

public class Productor_Consumer {
public static void main(String[] args){
HoldInt h = new HoldInt();//h为监控器
ProduceInt p = new ProduceInt(h);
ConsumeInt c = new ConsumeInt(h);
p.start();
c.start();
}
}

程序的打印出现了问题,没有对打印的顺序进行同步
likjjdblue 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 aptweasel 的回复:]
我不知道为会么非要这么实现,我们公司以前搞的一个ORACLE AQ就是这种原理,一个进就得一个出,否则就得等待,非常的不好用,有一种改良的办法看能不能达到你的要求
方法跟上面的两段代码类似,是我实现过的,至今还觉得用的效果不错,建一个公共堆盏,一个线程管进一个线程管出,进的时候不能出,出的时候不能进,先进后出,后进先出,一次执行一个,交叉执行就能达到你的效果,他还有一个好处,如果不做交叉,可以大大的提高性能。
也可以搞一个队列,一边进一边出,测试时显示顺序可能不一样,但是在执行业务逻辑的时候,决对错不了。
[/Quote]麻烦能举个例子吗,我是初学者,谢
ren197836yuan 2009-11-21
  • 打赏
  • 举报
回复
GOOD
echoheh 2009-11-20
  • 打赏
  • 举报
回复
学习!
本本Hello 2009-11-20
  • 打赏
  • 举报
回复
ding
  • 打赏
  • 举报
回复
up
yuandong300 2009-11-20
  • 打赏
  • 举报
回复
good
加载更多回复(28)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧