----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------
根據交通燈管理系統的需求:設計一個Road類來表示路線,一個Road對象就表示這一條路線,總共有十二條路線。每條路線上隨機增加新的車輛,增加到一個集合中儲存。每條路線每隔一秒都會檢查控制本路線的燈是否為綠,是則將本路線儲存車的集合中的第一輛車移除,即表示車穿過了路口。
public class Road { private List<String> vechicles = new ArrayList<String>();//這個集合中放著車輛 private String name = null; public Road(String name) { this.name = name; ExecutorService pool = Executors.newSingleThreadExecutor();//添加一個線程隨機添加車輛 pool.execute(new Runnable(){ @Override public void run() { for (int i = 1; i < 1000; i++) { try { Thread.sleep((new Random().nextInt(10)+1)*1000); } catch (InterruptedException ex) { Logger.getLogger(Road.class.getName()).log(Level.SEVERE, null, ex); } vechicles.add(Road.this.name+"_"+i); } } }); ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);//添加一個線程每隔1秒查看自己所在的路線是否綠燈,如果綠燈本路線還有車將開走一輛 timer.scheduleAtFixedRate( new Runnable(){ @Override public void run() { if(vechicles.size()>0){ boolean lighted = Lamp.valueOf(Road.this.name).isLighted(); if(lighted==true){ System.out.println(vechicles.remove(0)+"is traversing !"); } } } }, 1, 1, TimeUnit.SECONDS); }設計一個Lamp類來表示一個交通燈,每個交通燈都維護一個狀態:亮(綠)或不亮(紅)。總共有12條路線,總共要產生12個交通燈。右拐彎的路線本來不受燈的控制,但是為了讓程式採用統一的處理方式,故假設出有四個右拐彎的燈,只是這些燈為常亮狀態,即永遠不變黑。其他8條路線的燈,它們是兩兩成對的,可以歸為4組。從這4組中各取出一個燈,對這4個燈依次輪詢變亮,與這4個燈方向對應的燈則隨之一同變化,因此Lamp類中要有一個變數來記住自己相反方向的燈,在一個Lamp對象的變亮和變黑方法中,將對應方向的燈也變亮和變黑。每個燈變黑時,都伴隨者下一個燈的變亮,Lamp類中還用一個變數來記住自己的下一個燈。無無論在程式的什麼地方去獲得某個方向的燈時,每次獲得的都是同一個執行個體對象,所以Lamp類改用枚舉來做。永遠都只有代表12個方向的燈的執行個體對象。
public enum Lamp { S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false), N2S(null,null,false),N2E(null, null, false),W2E(null, null, false),W2N(null, null, false), S2E(null,null,true),E2N(null, null, true),N2W(null, null, true),W2S(null, null, true); //12盞燈(對面燈,下一盞燈,燈的狀態) private boolean lighted; private String opposite; private String next; private Lamp(String opposite,String next,boolean lighted){//建立燈的時候就要設定燈的參數 this.opposite = opposite; this.next = next; this.lighted = lighted; } public boolean isLighted(){//燈的狀態 return lighted; } public void light(){//點亮燈,同時點亮對方的燈 this.lighted = true; if(opposite != null){ Lamp.valueOf(opposite).light(); } System.out.println(name()+"lamp is gree, 下面總共應該有6個方向能看到汽車穿過"); } public Lamp blackOut(){//把燈黑掉,同時也黑掉對面燈,又把下一盞燈點亮並返回出點亮的燈 this.lighted = false; if(opposite != null){ Lamp.valueOf(opposite).blackOut(); } Lamp nextLamp = null; if(next != null){ nextLamp = Lamp.valueOf(next); nextLamp.light(); } return nextLamp; }設計一個LampController類,它定時讓當前的綠燈變紅。}public class LampController { private Lamp currentLamp; //把燈傳進來 public LampController(){//在建構函式裡就把一組燈點亮,在建立一個定時器,每個10秒把自己黑了,在把下一組燈點亮 currentLamp = Lamp.S2N; currentLamp.light(); ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate( new Runnable(){
@Override public void run() { currentLamp = currentLamp.blackOut(); } }, 10, 10, TimeUnit.SECONDS); }在建立一個類來測試一下public class MainClass { public static void main(String[] args){ String[] directions = new String[]{ "S2N", "S2W", "E2W", "E2S","N2S", "N2E", "W2E", "W2N","S2E", "E2N", "N2W", "W2S"//將12盞燈放進一個數組中 }; for (int i = 0; i < directions.length; i++) {//建立12條路,並把燈放在每條路中 new Road(directions[i]); } new LampController();//建立燈的控制器,開始工作 }}交通燈我學到的就是這些了----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------