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();
}
}
測試結果: