黑马程序员技术交流社区
标题:
关于这个单生产单消费的问题,不用同步,用锁机制如何完成
[打印本页]
作者:
dsh
时间:
2014-10-11 21:00
标题:
关于这个单生产单消费的问题,不用同步,用锁机制如何完成
package Thread_02_Produce_Consume;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Phone {
//定义手机属性
String brand;
String color;
boolean flag = false;
//Lock ck = new ReentrantLock();
public Phone() {
super();
}
//生产手机应该是手机的功能
public synchronized void setPhone(String brand,String color ) {
//ck.lock();
//如果有手機,就等待
if(flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//生产手机
this.brand=brand;
this.color= color;
System.out.println(Thread.currentThread().getName()+"生产手机"+brand+"..."+color);
//生产完后,更新手机的状态
flag= true;
//唤醒消费者
notify();
}
//消费手机应该是手机的功能
public synchronized void getPhone() {
if(!flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"消费手机"+brand+"..."+color);
//更新手机的状态
flag=false;
//唤醒生产者
notify();
}
}
复制代码
package Thread_02_Produce_Consume;
public class Consume_Phone implements Runnable {
Phone p;
public Consume_Phone(Phone p) {
this.p = p;
}
@Override
public void run() {
while (true) {
p.getPhone();
}
}
}
复制代码
package Thread_02_Produce_Consume;
/**
* 需求:单生产单消费
*
* 分析: 生产者类
* setPhone();
* 消费者类
* getPhone();
* 手机类
* 手机提供者
* 测试类
*
*
*/
public class Produce_Consume {
public static void main(String[] args) {
//创建共享数据源
Phone p = new Phone();
//创建生产对象
Produce_Phone pp = new Produce_Phone(p);
//创建消费者对对象
Consume_Phone cp = new Consume_Phone(p);
//创建线程
Thread t1 =new Thread(pp);
Thread t2 =new Thread(cp);
//开启线程
t1.start();
t2.start();
}
}
复制代码
package Thread_02_Produce_Consume;
public class Produce_Phone implements Runnable{
private Phone p;
private int num =0;
public Produce_Phone(Phone p) {
this.p = p;
}
@Override
public void run() {
while(true){
if(num%2==0){
p.setPhone("IPhone", "土豪金");
}else{
p.setPhone("小米4", "白色");
}
num++;
}
}
}
复制代码
作者:
hollywood2014
时间:
2014-10-11 21:38
你写的是对的吧我的建议是
public void produce()
{
lock.lock();
try
{
if(不满足)
...wait();//此时该线程仍然持有锁
//满足
生产手机
将标志取反
notifyall或者指定某一个与锁绑定的条件唤醒
}
catch(InterruptException e)// wait()可能会有该异常,若不处理,线程便会被中断
{
do something
}
finally
{
lock.unlock();
}
}
我也是正在学习这一块,有什么不对的地方还望指正
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2