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来判断轮到哪个窗口卖票。