JAVA實驗 多執行緒的使用
阿新 • • 發佈:2019-02-01
實驗內容:
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(); } }