//有一个数据存储空间,划分为两部分,一部分用于存储人的姓名,另外一部分用于存储人的性别。
//创建两个线程,一个用于向数据存储空间添加数据,另一个线程从数据存储空间取出数据
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++;
}
}
线程通讯问题
最新推荐文章于 2024-09-27 00:45:01 发布