多线程——买票实验
Cinema.java
public class Cinema implements Runnable
{
TicketSeller seller;
String name1,name2,name3,name4,name5;
Cinema(String s1,String s2,String s3,String s4,String s5){
seller =new TicketSeller();
name1=s1;
name2=s2;
name3=s3;
name4=s4;
name5=s5;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(Thread.currentThread().getName().equals(name1)){
seller.sellTicket(20, 2);
}
else if(Thread.currentThread().getName().equals(name2)){
seller.sellTicket(20, 1);
}
else if(Thread.currentThread().getName().equals(name3)){
seller.sellTicket(10, 1);
}
else if(Thread.currentThread().getName().equals(name4)){
seller.sellTicket(10, 2);
}
else if(Thread.currentThread().getName().equals(name5)){
seller.sellTicket(5, 1);
}
}
}
TicketSeller.java
public class TicketSeller {
int fiveNumber=1,tenNumber=0,twentyNumber=0;
public synchronized void sellTicket(int recerverMoney,int
neddTicketNumber){
String s=Thread.currentThread().getName();
if(recerverMoney==5&&neddTicketNumber==1){
fiveNumber=fiveNumber+1;
System.out.println(s+"给售票员5元钱,售票员卖给"+s+"一张票,不必找零");
}
else if(recerverMoney==10){
if(neddTicketNumber==2){
tenNumber=tenNumber+1;
System.out.println(s+"给售票员10元钱,售票员卖给"+s+"2张票,不必找零");
}
else {
while(fiveNumber<1 ){
try{
System.out.println(s+"给售票员10元钱,要买一张票");
System.out.println("售票员请"+s+"靠边等一会");
wait();
System.out.println(s+"结束等待,继续买票");
}
catch(InterruptedException e){}
}
fiveNumber=fiveNumber-1;
tenNumber=tenNumber+1;
System.out.println(s+"给售票员10元钱,售票员卖给"+s+"1张票,找零5元");
}
}
else if(recerverMoney==20){
if(neddTicketNumber==2)
{
while(tenNumber<1){
try{
System.out.println(s+"给售票员20元钱,要买两张票");
System.out.println("售票员请"+s+"靠边等一会");
wait();
System.out.println(s+"结束等待,继续买票");
}
catch(InterruptedException e){}
}
tenNumber=tenNumber-1;
twentyNumber=twentyNumber+1;
System.out.println(s+"给售票员20元钱,售票员卖给"+s+"2张票,找零10元");
}
else {
while(tenNumber<1||fiveNumber<1){
try{
System.out.println(s+"给售票员20元钱,要买一张票");
System.out.println("售票员请"+s+"靠边等一会");
wait();
System.out.println(s+"结束等待,继续买票");
}
catch(InterruptedException e){}
}
fiveNumber=fiveNumber-1;
tenNumber=tenNumber-1;
twentyNumber=twentyNumber+1;
System.out.println(s+"给售票员20元钱,售票员卖给"+s+"1张票,找零15元");
}
}
notifyAll();
}
}
MyThreadWork.java
import java.util.*;
public class MyThreakWork {
public static void main(String args[]){
int i;
String s1="赵",s2="钱",s3="孙",s4 = "李",s5="周";
Cinema cinema=new Cinema(s1,s2,s3,s4,s5);
Thread zhao,qian,sun,li,zhou;
zhao=new Thread(cinema);
qian=new Thread(cinema);
sun=new Thread(cinema);
li=new Thread(cinema);
zhou=new Thread(cinema);
zhao.setName(s1);
qian.setName(s2);
sun.setName(s3);
li.setName(s4);
zhou.setName(s5);
zhao.start();
qian.start();
sun.start();
li.start();
zhou.start();
}
}
此时实验结果截图;
在每个Thread开始之后即MyThreadWork.java
代码改变为
import java.util.*;
public class MyThreakWork {
public static void main(String args[]){
int i;
String s1="赵",s2="钱",s3="孙",s4 = "李",s5="周";
Cinema cinema=new Cinema(s1,s2,s3,s4,s5);
Thread zhao,qian,sun,li,zhou;
zhao=new Thread(cinema);
qian=new Thread(cinema);
sun=new Thread(cinema);
li=new Thread(cinema);
zhou=new Thread(cinema);
zhao.setName(s1);
qian.setName(s2);
sun.setName(s3);
li.setName(s4);
zhou.setName(s5);
zhao.start();
try{
Thread.sleep(100);
}
catch(Exception e){}
qian.start();
try{
Thread.sleep(100);
}
catch(Exception e){}
sun.start();
try{
Thread.sleep(100);
}
catch(Exception e){}
li.start();
try{
Thread.sleep(100);
}
catch(Exception e){}
zhou.start();
try{
Thread.sleep(100);
}
catch(Exception e){}
}
}
后的实验结果截图为