1. 程式人生 > >JAVA實驗 多執行緒的使用

JAVA實驗 多執行緒的使用

實驗內容:

1.哈爾濱火車站下面有三個火車票代售點,假如哈爾濱到北京的火車票總共是200張,如何用程式來實現三個售票點同時賣票的功能。

2.設計5個人排隊買票,並規定買票規則和排隊順序。


程式碼實現:

package cn.edu.nefu.zhihu.xiancheng;

public class ChuangKou implements Runnable{
	int m=200;
	public void run() {
		while(m>0){
			synchronized(this){
				if(m>0)
				System.out.println(Thread.currentThread().getName()+"視窗賣出一張後,"+"總票數還剩票數: "+(--m));
				try{
				Thread.sleep(10);
				}
				catch(InterruptedException e){}
			}
		}
	}
}


package cn.edu.nefu.zhihu.xiancheng;

public class Test {

	public static void main(String[] args) {
		ChuangKou ck=new ChuangKou();
		Thread t1=new Thread(ck,"ck1");
		Thread t2=new Thread(ck,"ck2");
		Thread t3=new Thread(ck,"ck3");
		t1.start();
		t2.start();
		t3.start();
		while(true){
			if(ck.m==0){
				System.out.println("票已賣完!");
				break;
			}
		}
	}
}


package cn.edu.nefu.pack1;

public class A{
    public static void main(String args[]){
        String s1="張三",s2="孫大名",s3="趙中堂",s4="王二小",s5="李四風";
        Cinema canema=new Cinema(s1,s2,s3,s4,s5);
        Thread zhang,sun,zhao,wang,li;  
        zhang=new Thread(canema);
        sun=new Thread(canema);
        zhao=new Thread(canema);
        wang=new Thread(canema);
        li=new Thread(canema);
        zhang.setName(s1);
        sun.setName(s2);
        zhao.setName(s3);
        wang.setName(s4);
        li.setName(s5);
        zhang.start();
        sun.start();
        zhao.start();
        wang.start();
        li.start();
    }
}
class Cinema implements Runnable{    //實現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;
    } 
    public void run(){
       if(Thread.currentThread().getName().equals(name1)){
          seller.sellTicket(20);
       }
       else if(Thread.currentThread().getName().equals(name2)){
          seller.sellTicket(10);
       }
       else if(Thread.currentThread().getName().equals(name3)){
          seller.sellTicket(5);
       }
       else if(Thread.currentThread().getName().equals(name4)){
           seller.sellTicket(10);
        }
       else if(Thread.currentThread().getName().equals(name5)){
           seller.sellTicket(10);
        }
    }
}
class TicketSeller{         //負責賣票的類
    int fiveNumber=3,tenNumber=1,twentyNumber=0; 
    public synchronized void sellTicket(int receiveMoney){
        String s=Thread.currentThread().getName();
        if(receiveMoney==5){
           fiveNumber=fiveNumber+1; 
           System.out.println(s+"給售票員5元錢,售票員賣給"+s+"一張票,不必找贖");
        }
        else if(receiveMoney==10){
           while(fiveNumber<1){
               try{  System.out.println(s+"給售票員10元錢");
                    System.out.println("售票員請"+s+"靠邊等一會");
                    wait();  //如果執行緒佔有CPU期間執行了wait(),就進入中斷狀態
                    System.out.println(s+"ppppp結束等待,繼續買票");
               }
               catch(InterruptedException e){}
           }
           fiveNumber=fiveNumber-1;
           tenNumber=tenNumber+1;
           System.out.println(s+"給售票員10元錢,售票員賣給"+s+"一張票,找贖5元");
        }
        else if(receiveMoney==20){
           while(fiveNumber<1||tenNumber<1){
               try{  System.out.println(s+"給售票員20元錢");
                    System.out.println("售票員請"+s+"靠邊等一會");
                    wait();  //如果執行緒佔有CPU期間執行了wait(),就進入中斷狀態
                    System.out.println(s+"ooooo結束等待,繼續買票");
               }
               catch(InterruptedException e){}
           }
           fiveNumber=fiveNumber-1;
           tenNumber=tenNumber-1;
           twentyNumber=twentyNumber+1;
           System.out.println(s+"給售票員20元錢,售票員賣給"+s+"一張票,找贖15元");
        }
        notifyAll();
    }
}