線程通信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();
	}

}

測試結果:


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