线程通信Java

 Java线程通信实现,通过方法调用:wait();notify();notifyAll();

wait();方法要求当前线程等待

notify();方法唤醒等待的线程

notifyAll();方法唤醒所有等待的线程


测试实例:ACBD向售票员买票问题,售票员只有当手里有三张钱币时才能找零

BuyTicket类,购票

package com.anson.java;

/**
 * 线程通信实例——ABCD向售票员买票
 * @author anson
 *
 */
public class BuyTicket implements Runnable {
	
	private int ticketTotalMoney=1;//售票人只有当手里有3元时才能付账
	
	/**
	 * 买票
	 */
	 private void buy()
	{
		 synchronized(this)
		 {
				String name=Thread.currentThread().getName();
				if("A".equals(name))
				{
					if(this.ticketTotalMoney<3)
					{
						try
						{
							System.out.println("钱不够找,"+name+"等待");
							wait();//线程等待
							System.out.println("卖给"+name+"一张票");
						}
						catch (InterruptedException e)
						{
							e.printStackTrace();
						}
					}
				}
				else if("B".equals(name))
				{
					this.ticketTotalMoney++;
					System.out.println("卖给"+name+"一张票");
				}
				else if("C".equals(name))
				{
					this.ticketTotalMoney++;
					System.out.println("卖给"+name+"一张票");
				}
				else if("D".equals(name))
				{
					this.ticketTotalMoney++;
					System.out.println("卖给"+name+"一张票");
				}
				
				if(this.ticketTotalMoney>=3)
				{
					notify();//唤醒等待线程
				}
				
		 }
	}
	 
	 
	/**
	 * 线程方法
	 */
	@Override
	public void run() {
		buy();
	}

}


Test类,测试线程通信

package com.anson.java;

public class Test {

	/**
	 * 测试线程通信
	 * @param args
	 */
	public static void main(String[] args) {
		BuyTicket buyTicket=new BuyTicket();
		
		Thread A=new Thread(buyTicket);
		A.setName("A");
		
		Thread B = new Thread(buyTicket);
		B.setName("B");
		
		Thread C=new Thread(buyTicket);
		C.setName("C");
		
		Thread D=new Thread(buyTicket);
		D.setName("D");
		
		A.start();
		B.start();
		C.start();
		D.start();
	}

}

测试结果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章