开发者社区> 问答> 正文

Java关于线程同步的问题

private int value;
private boolean isEmpty=true;
public synchronized void put(int i) {
while(!this.isEmpty)
try {
this.wait();
} catch (InterruptedException e) {}
this.value=i;
this.isEmpty=false;
this.notify();
}
public synchronized int get() {
while(this.isEmpty)
try {
this.wait();
} catch (InterruptedException e) {}
this.isEmpty=true;
this.notify();
return this.value;
}
public static void main(String args[]) {
Buffer buffer=new Buffer();
(new SendThread(buffer)).start();
(new ReceiveThread(buffer)).start();
}
}
public class SendThread extends Thread {
private Buffer buffer;
public SendThread(Buffer buffer){
this.buffer=buffer;
}
public void run(){
for(int i=1;i<5;i++){
buffer.put(i);
System.out.println(this.getClass().getName()+"put:"+i);
}
}
}
public class ReceiveThread extends Thread {
private Buffer buffer;
public ReceiveThread(Buffer buffer) {
this.buffer=buffer;
}
public void run() {
for(int i=1;i<5;i++){
System.out.println("\t\t\t\t"+this.getClass().getName()+"get:"+buffer.get());
}
}
}

感觉代码没错啊 但是结果总是不正确
screenshot

展开
收起
蛮大人123 2016-03-24 15:48:01 2024 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    这是一个典型的 single threaded pattern。
    和生产者消费者模型还是有区别的。毕竟只是一个empty,不是一个列表
    程序是没有问题的。
    您是感觉输出结果不像是线程那种随机的感觉吧。
    你的输出结果规律性太强是不?
    主要有2点原因:

    1--如果你不put,那么get的线程就一直等。关键就是一个empty的控制。
    如果你使用的是一个队列,那么效果可能会改变。

    2--没有引入随机控制

    将程序做如下改动:

    a.给sendThread和receivethtread类加入私有成员变量
    private Random random;

    b.修改2个类的构造函数,以Send的线程为例

    public SendThread(Buffer buffer,long seed){
    this.buffer=buffer;
    this.random = new Random(seed);
    }

    c.修改run方法,在末尾加上如下代码

    try {
    Thread.sleep(this.random.nextInt(1000));
    } catch (InterruptedException e) {
    
                e.printStackTrace();
            }
        d.修改main方法
    

    ` (new SendThread(buffer,3141592L)).start();
    (new ReceiveThread(buffer,6535897L)).start();`
    建议使用生产者消费者模型
    这样效果更直观

    2019-07-17 19:12:53
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载