Java多媒体与多线程处理

Java多媒体与多线程处理

编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示);

程序分析:1.票数要使用同一个静态值

                   2.为保证不会出现卖出同一个票数,要java多线程同步锁。

设计思路:1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站                       台卖这张票时,其他站台要等这张票卖完!

 

实现代码

import java.util.concurrent.*;
public class Station {
	static int tickets  = 21;
	public static int state = 1;
	public static void main(String[] args){
		window1 w1 = new window1();
		
		Thread a = new Thread(new Runnable(){
			public void run(){
				w1.first();
			}
		});
		
		Thread b = new Thread(new Runnable(){
			public void run(){
				w1.second();
			}
		});
		
		Thread c = new Thread(new Runnable(){
			public void run(){
				w1.third();
			}
		});
		a.start();
		b.start();
		c.start();
	}
}

class window1{
	private static Object lock = new Object();
	
	public void first(){
		synchronized(lock){
			for(;Station.tickets > 1; ){
							
					if(Station.state != 1){
						try{
								lock.wait();
							}
							catch(InterruptedException e){
							  
							}
					}
				else{
					Station.tickets--;
					System.out.printf("窗口1卖出了第%d张票\n",Station.tickets);
					if(Station.tickets == 1) System.out.println("卖完了");
					Station.state = 2;
					//System.out.println(Station.state);
					lock.notifyAll();
				}
			}
		}
	}
	
	public void second(){
		synchronized(lock){
			for(;Station.tickets > 1; ){										
				 if(Station.state != 2){
					try{
							lock.wait();
						}
					catch(InterruptedException e){
							   
						}
					}
				else{
					Station.tickets--;
					System.out.printf("窗口2卖出了第%d张票\n",Station.tickets);
					if(Station.tickets == 1) System.out.println("卖完了");
					Station.state = 3;
					//System.out.println(Station.state);
					lock.notifyAll();
				}
			}
				
		}	
	}	
	
	
	public void third(){
			synchronized(lock){
				for(;Station.tickets > 1; ){				
						 if(Station.state != 3){
							try{
									lock.wait();
								}
								catch(InterruptedException e){
								   
								}
						}
					else{
						Station.tickets--;
						System.out.printf("窗口3卖出了第%d张票\n",Station.tickets);
						if(Station.tickets == 1) System.out.println("卖完了");
						Station.state = 1;
						//System.out.println(Station.state);
						lock.notifyAll();
					}
				}
				
			}	
		}		
}
 


总结:

如果不进行控制,调度有一定的随机性。所以要实现本实验的结果,需要对卖票操作加上同步锁。实验中利用静态变量state来判断轮到哪个窗口卖票。

猜你喜欢

转载自blog.csdn.net/qq_41900081/article/details/83279795