多线程--模拟多窗口卖票

学习java多线程知识点–线程安全与同步
基础练习–模拟多窗口卖票程序。

#1.多窗口卖票–各自卖票

package com.cc.sellticket;
/**
 * 模拟多窗口卖票 -- 每个窗口各自卖票
 * @author CC
 *
 */
public class SellTicket1 extends Thread{
	private int tickets = 50;
	
	public SellTicket1(String name) {
		super(name);
	}
	
	@SuppressWarnings("static-access")
	@Override
	public void run() {
		super.run();

		while(tickets > 0) {
			tickets-- ;
			
			
			System.out.println(this.currentThread().getName()+"窗口卖了第"+(50-tickets)+"张票");
		}
		
	}
}
package com.cc.sellticket;
/**
 * 模拟多窗口卖票
 * 每个窗口50张票,各自卖各自的票直到卖完
 * @author CC
 *
 */
public class TestForSellTicket1 {
	public static void main(String[] args) {
		SellTicket1 sell1 = new SellTicket1("1号");
		SellTicket1 sell2 = new SellTicket1("2号");
		SellTicket1 sell3 = new SellTicket1("3号");
		SellTicket1 sell4 = new SellTicket1("4号");
		
		sell1.start();
		sell2.start();
		sell3.start();
		sell4.start();
		
	}
}

#2.多窗口卖票–共同卖票

package com.cc.sellticket;
/**
 * 模拟多窗口卖票 -- 多个窗口共同卖票
 * @author CC
 *
 */
public class SellTicket2 extends Thread{
	//因为循环需控制所有线程票数大于0
	private int tickets = 50;
	
	@Override
	public void run() {
		super.run();
		
		while(true) {
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				sell();
			} catch (Exception e) {
				System.out.println(e.getMessage());
				return;
			}
		}
		
	}
	
	
	synchronized private void sell() throws Exception {
		if(tickets <= 0) {
			throw new Exception(SellTicket2.currentThread().getName()+"窗口停止售票!");
		}
		tickets -- ;
		System.out.println(SellTicket2.currentThread().getName()+"窗口卖了第"+(50-tickets)+"张票");
	}
}
package com.cc.sellticket;

public class TestForSellTicket2 {
	public static void main(String[] args) {
		SellTicket2 sell = new SellTicket2();
		
		Thread thread1 = new Thread(sell,"1号");
		Thread thread2 = new Thread(sell,"2号");
		Thread thread3 = new Thread(sell,"3号");
		Thread thread4 = new Thread(sell,"4号");
		
		thread1.start();
		thread2.start();
		thread3.start();
		thread4.start();
		
		
	}
}

大家有没有发现我的错误,我是好像发现了,哭奔。
#2.1多窗口卖票–共同卖票 (修正版)
synchronized用法:对象锁而不是方法锁,现改成如下:

package com.cc.sellticket2;

public class TicketNum {
	private int tickets = 50;

	public TicketNum() {
		super();
	}

	public TicketNum(int tickets) {
		super();
		this.tickets = tickets;
	}

	public int getTickets() {
		return tickets;
	}

	public void setTickets(int tickets) {
		this.tickets = tickets;
	}
	
	synchronized public void sellTickets() throws Exception {
		if(tickets > 0) {
			tickets-- ;
			System.out.println(Thread.currentThread().getName()+"窗口卖了1张票,待卖票数:"+tickets);
		}else {
			throw new Exception("买完了");
		}
	}
}
package com.cc.sellticket2;

public class SellTicketsThread extends Thread{
	private TicketNum ticketNum;

	public SellTicketsThread(TicketNum ticketNum) {
		super();
		this.ticketNum = ticketNum;
	}
	
	@Override
	public void run() {
		while(true) {
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try {
				ticketNum.sellTickets();
			} catch (Exception e) {
				System.out.println("卖完了!");
				break;
			}
			
		}
	}

}
package com.cc.sellticket2;

public class Run1 {
	public static void main(String[] args) {
		TicketNum ticketNum = new TicketNum(50);
		SellTicketsThread t1 = new SellTicketsThread(ticketNum);
		t1.setName("1号");
		SellTicketsThread t2 = new SellTicketsThread(ticketNum);
		t2.setName("2号");
		SellTicketsThread t3 = new SellTicketsThread(ticketNum);
		t3.setName("3号");
		SellTicketsThread t4 = new SellTicketsThread(ticketNum);
		t4.setName("4号");
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值