线程通讯问题


//有一个数据存储空间,划分为两部分,一部分用于存储人的姓名,另外一部分用于存储人的性别。
//创建两个线程,一个用于向数据存储空间添加数据,另一个线程从数据存储空间取出数据
public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Q q=new Q();

Consumer con=new Consumer(q);
Producer pro=new Producer(q);

new Thread(con).start();
new Thread(pro).start();

}

}
class Q
{
private String name;
private String sex;
private boolean flag=false;

public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}

}

class Consumer implements Runnable //从Q中向外读取的一个线程;
{

private Q q;
public Consumer(Q q)
{
this.q=q;
}
public void run() {
// TODO Auto-generated method stub
while(true)
{

synchronized(q)
{
if(!q.isFlag())
try {
q.wait(); //读取的线程等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(q.getName()+":"+q.getSex());
q.notify(); //唤醒插入的线程
q.setFlag(false);

}

}
}

}

class Producer implements Runnable //向Q中插入的一个线程;
{


private Q q;
private int i=0;
public Producer(Q q)
{
this.q=q;
}
public void run() {
// TODO Auto-generated method stub
while(true)
{
synchronized(q)
{
if( q.isFlag())
try {
q.wait();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(i%2==0)
{

q.setName("zhangsan");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
q.setSex("male");

}
else
{

q.setName("lisi");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
q.setSex("female");

}
q.notify(); //唤醒读取的线程
q.setFlag(true);
}
i++;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值