中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么看待java多線程交通信號燈模擬過程

發布時間:2021-10-13 16:29:50 來源:億速云 閱讀:146 作者:柒染 欄目:編程語言

怎么看待java多線程交通信號燈模擬過程,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

交通信號燈的線程設計

實驗目的:多線程設計,同步機制  題意 設計一個交通信號燈類:      變量:位置、顏色(紅、黃、綠)、顯示時間(秒)。    方法:切換信號燈。      創建并啟動兩個線程(東西向、南北向)同時運行。  實驗要求      設計線程。    設計路口信號燈示意圖界面。    進一步將每個方向的信號燈分成3種車道燈:左轉、直行和右轉。    根據車流量進行時間的模糊控制。

在課程設計的開始并沒有仔細看老師的要求,只知道是交通信號燈。然后就開始各種找資料,百度,網上大量的關于紅綠燈的設計都是參考張孝祥老師的教程,大概的設計方法是創建了三個類 lamp、road、lampcontrol。

然鵝......對.....然鵝又來了,在查了大概兩天資料后,我又反過來看了一遍老師發的設計要求.....這這這.....,光控制燈就行了啊,不要車的啊,捂臉...

所以設計思路馬上就變得清晰,根據張老師的做法,每個路口都有三個燈,分別為左轉、直行、右轉,所以一共有12盞燈。按照要求,右轉燈為常亮燈,左轉和直行燈才有紅綠交替。在除去右轉燈的八個燈里面,又可以分為四組可以兩兩匹配的燈,分別為東西左轉南北(平行轉垂直)、南北直行(垂直通行)、南北左轉東西(垂直轉平行)、東西直行(平行通行)。

于是我給這個12個燈編了個號:

emmm 大概就是這樣,但是跟生活中的紅綠燈不同,生活中的都是看對面路口的燈,我們這里是模擬嘛....就各個路口用各個路口的燈唄.....

大致解釋一下,

1號燈為由南向西的左轉燈,2號燈為由南向北的直行燈,3號燈為由南向東的右轉燈。

4號燈為由東向北的右轉燈,5號燈為由東向西的直行燈,6號燈為由東向南的左轉燈。

7號燈為由北向西的右轉燈,8號燈為由北向南的直行燈,9號燈為由北向東的左轉燈。

10號燈為由西向北的左轉燈,11號燈為由西向東的直行燈,12號燈為由西向南的右轉燈。

然后根據匹配的原則,大概就是這么一張圖:

我們就可以得到:

這四組信號燈。

到這里我們思路就很清晰了,我們可以分別為每一組信號燈開一個進程,然后使四個進程循環交替進行就實現了綠燈的轉換。使用了程的同步技術。

當然,我們都已經開了四個進程了,為了錦上添花,我當然不介意再加個小車了hhhhhh

實驗結果圖:

源代碼:

light類:

package traffic; public class light {int x,y;         //燈在畫布上的位置boolean status;      //燈的狀態public light(int x,int y,boolean islight) {this.x=x;        this.y=y;this.status=islight;}public void setlight(boolean sta) {    //對外接口更改燈的狀態this.status=sta;}}

lamp類:

package traffic; public class lamp implements Runnable {light opposite, now;      //相互匹配的兩個燈int greentime;         //綠燈亮的時間int name;            //編組boolean status;         //狀態static Object lock = new Object(); public lamp(light l0, light l2,int gt, boolean st, int name) {now = l0;opposite = l2;status = st;greentime = gt;this.name = name;lightstatues();} public void change() { this.status = !(this.status);lightstatues();}public void setgreentime(int time) {this.greentime=time;}public int getgreentime() {return this.greentime;}public void lightstatues() {opposite.setlight(status);now.setlight(status);} public void run() {while (true) {synchronized (lock) {        //使用synchronized實現進程間的互斥if (name == mainclass.panel.islight) {      //使用輔助變量實現進程按順序循環//System.out.println("now is: "+name);change();mainclass.panel.repaint();try {Thread.sleep(greentime);} catch (InterruptedException e) {e.printStackTrace();}lock.notifyAll();        //喚醒其他進程change();mainclass.panel.LampChange();mainclass.panel.repaint();try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}} else {try {lock.wait();      //掛起進程} catch (InterruptedException e) {e.printStackTrace();}}}}}}

Mypanel類:

package traffic; import java.awt.Color;import java.awt.Graphics;import java.util.ArrayList;import java.util.Random;import javax.swing.JPanel;public class Mypanel extends JPanel {light l0,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12;   //十二個燈lamp lamp1,lamp2,lamp3,lamp4;           //四組信號燈static int islight;                //實現進程循環的輔助變量Random r=new Random();static public ArrayList<light> lightlist= new ArrayList<light>();  //使用list方便遍歷每個燈static public ArrayList<car> carlist= new ArrayList<car>();//方便遍歷每個車public Mypanel() {// TODO Auto-generated constructor stubl0=addlist(l0, 212, 316, false);l2=addlist(l2, 242, 316, false);l3=addlist(l3, 272, 316, true);l4=addlist(l4, 316, 116, true);l5=addlist(l5, 316, 146, false);l6=addlist(l6, 316, 176, false);l7=addlist(l7,116 , 70, true);l8=addlist(l8, 146, 70, false);l9=addlist(l9, 176, 70, false);l10=addlist(l10, 70, 212, false);l11=addlist(l11, 70, 242, false);l12=addlist(l12, 70, 272, truelamp1=new lamp(l9,l0,2000,false,0);lamp2=new lamp(l11,l5,2000,false,1);lamp3=new lamp(l10,l6,2000,false,2);lamp4=new lamp(l8,l2,2000,false,3); islight = 0 ;Thread t1=new Thread(lamp1);      //創建并啟動線程Thread t2=new Thread(lamp2);Thread t3=new Thread(lamp3);Thread t4=new Thread(lamp4);t1.start();t2.start();t3.start();t4.start();}light addlist(light a,int x,int y,boolean sta) {a=new light(x,y,sta);lightlist.add(a);return a;}public void addcar() {          //生成小車int now,next;now=r.nextInt(4);next=r.nextInt(4);car testcar=null;while(now==next) next=r.nextInt(4);switch(now) {case 0:testcar=new car(now,next,l0,l2,l3);break;case 1:testcar=new car(now,next,l6,l5,l4);break;case 2:testcar=new car(now,next,l9,l8,l7);break;case 3:testcar=new car(now,next,l10,l11,l12);break;}carlist.add(testcar);Thread catt=new Thread(testcar);catt.start();}public void LampChange() {islight=(islight+1)%4;}public void paint(Graphics g) {super.paint(g);g.setColor(Color.darkGray);    //畫路g.fillRect(0, 100, 400, 6);g.fillRect(0, 300, 400, 6);g.fillRect(100, 0, 6, 400);g.fillRect(300, 0, 6, 400);g.setColor(Color.gray);g.fillRect(0, 200, 400, 2);g.fillRect(200, 0, 2, 400);g.setColor(Color.blue);g.setColor(Color.black);     //畫信號燈板g.fillRect(202,306, 100, 40);g.fillRect(306,106, 40, 100);g.fillRect(106,60, 100, 40);g.fillRect(60,202,40, 100);light temp;car buf;for(int i=0;i<carlist.size();i++) {   //畫車buf=carlist.get(i);g.setColor(Color.BLUE);g.fillRect(buf.x, buf.y, 50, 50);}for(int i=0;i<lightlist.size();i++) {    //畫燈temp=lightlist.get(i);if(temp.status)g.setColor(Color.green);elseg.setColor(Color.RED);g.fillOval(temp.x, temp.y, 20, 20);}}}

welcomepanel類:

package traffic; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import javax.swing.JPanel; public class welcomepanel extends JPanel implements Runnable{  //開始界面int info = 0;Boolean isLive=true; public void paint(Graphics g) {super.paint(g);g.fillRect(0, 0, 420,450);g.setColor(Color.red);g.setFont(new Font("微軟雅黑", Font.BOLD, 30));if (info % 2 == 0) {g.drawString("多線程紅綠燈模擬", 80, 150);}} public void run() {// TODO Auto-generated method stubwhile (true) {try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}info++;this.repaint();if (isLive == false) {break;}}}}

set類:

package traffic; import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField; public class set extends JFrame implements ActionListener {   //設置界面  JLabel lab1,lab2,lab3,lab4;  JTextField jtext1,jtext2,jtext3,jtext4;  JPanel panel1,panel2,panel3,panel4;  JButton jb1,jb2;  int time1,time2,time3,time4;public set(){   lab1=new JLabel("南北左轉東西:");  lab2=new JLabel("東西直行:");  lab3=new JLabel("東西左轉南北:");  lab4=new JLabel("南北直行:");  time1=mainclass.panel.lamp1.getgreentime();  time2=mainclass.panel.lamp2.getgreentime();  time3=mainclass.panel.lamp3.getgreentime();  time4=mainclass.panel.lamp4.getgreentime();  jtext1=new JTextField(String.valueOf(time1));  jtext2=new JTextField(String.valueOf(time2));  jtext3=new JTextField(String.valueOf(time3));  jtext4=new JTextField(String.valueOf(time4));    jb1=new JButton("確定");  jb1.addActionListener(this);  jb2=new JButton("取消");  jb2.addActionListener(this);    this.setLayout(new GridLayout(5,2,10,5));  this.add(lab1);  this.add(jtext1);  this.add(lab2);  this.add(jtext2);  this.add(lab3);  this.add(jtext3);  this.add(lab4);  this.add(jtext4);  this.add(jb1);  this.add(jb2);    this.setLocationRelativeTo(null);   this.setSize(200, 200);   this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  this.setResizable(false);    this.setVisible(true);   }  public void actionPerformed(ActionEvent e) {  if(e.getSource()==jb1) {    if(jtext1.getText().length()==0||jtext2.getText().length()==0||jtext3.getText().length()==0||jtext4.getText().length()==0)   JOptionPane.showMessageDialog(this, "請輸入完整數據!", "錯誤", JOptionPane.INFORMATION_MESSAGE);  else {  mainclass.panel.lamp1.setgreentime(Integer.parseInt(jtext1.getText()));  mainclass.panel.lamp2.setgreentime(Integer.parseInt(jtext2.getText()));  mainclass.panel.lamp3.setgreentime(Integer.parseInt(jtext3.getText()));  mainclass.panel.lamp4.setgreentime(Integer.parseInt(jtext4.getText()));  this.dispose();  }  }else if(e.getSource()==jb2){  this.dispose();  }  }}

mainclass主類:

package traffic;import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane; public class mainclass extends JFrame implements ActionListener{static Mypanel panel;JMenuBar jmb;JMenu jm1, jm2;JMenuItem jmi1, jmi2,jmi3,jmi4;welcomepanel sp;mainclass(){this.setTitle("traffic lamp");this.setSize(420,450);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jmb=new JMenuBar();jm1=new JMenu("控制");jm2=new JMenu("設置");jmi1=new JMenuItem("開始模擬");jmi1.addActionListener(this);jmi2=new JMenuItem("退出模擬");jmi2.addActionListener(this);jmi3=new JMenuItem("隨機生成小車");jmi3.addActionListener(this);jmi4=new JMenuItem("更改綠燈時間");jmi4.addActionListener(this);jm1.add(jmi1);jm1.add(jmi2);jm1.add(jmi3);jm2.add(jmi4);jmb.add(jm1);jmb.add(jm2);this.setJMenuBar(jmb);sp=new welcomepanel();Thread t=new Thread(sp);t.start();this.setContentPane(sp);this.setLocationRelativeTo(null); this.setResizable(false);this.setVisible(true);}public void actionPerformed(ActionEvent e) {if(e.getSource()==jmi1) {sp.isLive=false;this.remove(sp);panel = new Mypanel();this.setContentPane(panel);this.setVisible(true);}else if(e.getSource()==jmi2) {System.exit(0);}else if(e.getSource()==jmi3) {if(panel==null)  JOptionPane.showMessageDialog(this, "請開始模擬再生成小車", "錯誤", JOptionPane.INFORMATION_MESSAGE);else panel.addcar();}else if (e.getSource() == jmi4) {if(mainclass.panel==null)  JOptionPane.showMessageDialog(this, "請開始模擬再進行設置", "錯誤", JOptionPane.INFORMATION_MESSAGE);else new set();}}public static void main(String[] args) {new mainclass();}}

多線程正確性測試:

我們在lamp類的run()方法中添加了一句控制臺打印命令,每次進程運行時即會打印此進程的name成員

正確的打印結果應該為 0-1-2-3-4-0-1-2-3-4-.......-1-2-3-....

控制臺的輸出結果為:

符合預測結果,實驗完成!

看完上述內容,你們掌握怎么看待java多線程交通信號燈模擬過程的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柞水县| 古丈县| 佳木斯市| 东兴市| 曲松县| 宁乡县| 鹰潭市| 漠河县| 财经| 高州市| 东城区| 金沙县| 迁西县| 泸溪县| 拉萨市| 苏尼特右旗| 依兰县| 同江市| 上杭县| 来宾市| 得荣县| 宣威市| 南岸区| 盐源县| 蓬莱市| 登封市| 江阴市| 乌什县| 香格里拉县| 隆子县| 上栗县| 台江县| 鞍山市| 类乌齐县| 双峰县| 辽宁省| 革吉县| 穆棱市| 开阳县| 张家口市| 洛隆县|