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();
}
}
测试结果: