发送线程与接收线程 速率一致


package com.jbx.xiezuo;

/**
* 采用信号量和同步方法使发送线程与接收线程同步运行。
*
* @author Administrator
* value是共享变量,put()和get()方法都要对value进行操作。由于put()和get()方法针对同一个数据进行相反操作;
* 当value为空时,put()方法可以赋值而get()方法不可以赋值,必须等待;
* 反之,当value不为空时,get()方法可以取值,而put()方法不可以赋值,必须等待。
* 因此,put()和get()方法必须以value是否为空值作为标记互斥地、交替地进行。
*
*/
public class BufferLock { // 加互斥锁的缓冲区
private int value;
private boolean isEmpty = true; // value是否为空的信号量

public synchronized void put(int i) {
while (!isEmpty) // 当value不为空时,等待
try {
this.wait();
} catch (InterruptedException e) {

}

value = i; // 当value为空时,value获得值
isEmpty = false; // 设置value为不空状态
notify(); // 唤醒其他等待线程
}

public synchronized int get() { // 同步方法
while (isEmpty) // 当value为空时等待
try {
this.wait();
} catch (InterruptedException e) {

}


isEmpty = true; // 设置value为空状态,并返回值
notify();
return value;

}

public static void main(String[] args) {
BufferLock buffer = new BufferLock();
(new Sender(buffer)).start();
(new Receiver(buffer)).start();
}
}

class Sender extends Thread { // 发送线程类
private BufferLock buffer; // 用于交换数据的共享变量

public Sender(BufferLock buffer) { // 指定缓冲区
this.buffer = buffer;
}

public void run() {
for (int i = 1; i < 6; i++) { // 连续向缓冲区发送若干数据
buffer.put(i);
System.out.println("Sender put: " + i);
}
}
}

class Receiver extends Thread { // 接收线程类
private BufferLock buffer;

public Receiver(BufferLock buffer) {
this.buffer = buffer;
}

public void run() {
for (int i = 1; i < 6; i++) { // 连续从缓冲区接收若干数据
System.out.println("\t\t Receiver get:" + buffer.get());
}
}

}



运行结果:
Sender put: 1
Sender put: 2
Receiver get:1
Receiver get:2
Sender put: 3
Receiver get:3
Sender put: 4
Receiver get:4
Sender put: 5
Receiver get:5
解析:
其中,isEmpty是标记value是否为空的一个信号量,当value为空时,isEmpty值为true;当value不空时,isEmpty值为false。
在put()方法中,先查看信号量的状态,如果是isEmpty值为true,表示value为空,可以对value赋值,之后唤醒一个等待接收线程;否则表示value不空,即value值未被取走,此时不能对value赋值,只能等待。
在get()方法中,先查看信号量的状态,如果isEmpty值为true,表示value未赋值,此时取不到有效value值,只能等待;否则表示value不空,返回value值,并唤醒一个等待发送线程。
两个线程分别调用put()和get()方法执行流程如图所示。

[img]http://dl2.iteye.com/upload/attachment/0130/4072/9927649e-b8b4-3671-a68c-e4e240dfea62.png[/img]

运行结果,不同线程之间实现了同步传递数据。
注意:在互斥的put()和get()方法中,如果只有wait()方法而没有notify()方法,则线程死锁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值