`
javawangzilong
  • 浏览: 55325 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

线程通讯问题

阅读更多
//有一个数据存储空间,划分为两部分,一部分用于存储人的姓名,另外一部分用于存储人的性别。
//创建两个线程,一个用于向数据存储空间添加数据,另一个线程从数据存储空间取出数据
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++;
		}
		
	}
	
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics