Java多线程实现多窗口订票系统

synchronized锁使用方法:

方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入。

1.售票窗口:

public class TicketWindows implements Runnable{
	private int tickets=10;

	@Override
	public void run() {
		while(tickets>0)
		{
			synchronized(this)
			{
				if(tickets>0)
				{
					System.out.println(Thread.currentThread().getName()+"准备出票,还剩余票:"+tickets+"张");
					tickets--;
					System.out.println(Thread.currentThread().getName()+"卖出1张车票,还剩:"+tickets+"张");					
				}
				else
				{
					System.out.println("车票售空!");
				}
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
				
			}
		}
		
		
	}
	

}

 

2.主类:

public class BookTickets {

	public static void main(String[] args) {
		TicketWindows tw=new TicketWindows();
		Thread t1=new Thread(tw,"1号窗口");
		Thread t2=new Thread(tw,"2号窗口");
		Thread t3=new Thread(tw,"3号窗口");
		t1.start();
		t2.start();
		t3.start();
		// TODO 自动生成的方法存根

	}

}

3.运行结果(具有随机性)

1号窗口准备出票,还剩余票:10张
1号窗口卖出1张车票,还剩:9张
1号窗口准备出票,还剩余票:9张
1号窗口卖出1张车票,还剩:8张
2号窗口准备出票,还剩余票:8张
2号窗口卖出1张车票,还剩:7张
2号窗口准备出票,还剩余票:7张
2号窗口卖出1张车票,还剩:6张
2号窗口准备出票,还剩余票:6张
2号窗口卖出1张车票,还剩:5张
2号窗口准备出票,还剩余票:5张
2号窗口卖出1张车票,还剩:4张
2号窗口准备出票,还剩余票:4张
2号窗口卖出1张车票,还剩:3张
2号窗口准备出票,还剩余票:3张
2号窗口卖出1张车票,还剩:2张
2号窗口准备出票,还剩余票:2张
2号窗口卖出1张车票,还剩:1张
2号窗口准备出票,还剩余票:1张
2号窗口卖出1张车票,还剩:0张
车票售空!
车票售空!

 

注意:使用 synchronized 修饰run()方法是无效的!这会导致自始至终只有一个窗口进行卖票操作!

你可能感兴趣的:(Java多线程实现多窗口订票系统)