자바 다 중 스 레 드 교통 신호등 시 뮬 레이 션 과정 상세 설명
실험 목적:다 중 스 레 드 디자인,동기 화 체제4.567917.교통 신호등 류 를 디자인 하 는 데 목적 을 둔다.
디자인 스 레 드
거위..............................................................................................
그래서 디자인 방향 이 바로 뚜렷 해 졌 다.장 선생님 의 방법 에 따라 모든 길목 에 세 개의 등 이 있 는데 각각 좌회전,직진,우회전 이기 때문에 모두 12 개의 등 이 있다.요구 에 따라 우회전 등 은 상등 이 고 좌회전 과 직진 등 이 있어 야 빨간색 과 녹색 이 교체 된다.우회전 등 을 제외 한 8 개의 등 안 에는 동서 좌회전 남북(평행 회전 수직),남북 직진(수직 통행),남북 좌회전 동서(수직 회전 평행),동서 직진(평행 통행)등 4 개 조로 나 눌 수 있다.
그래서 나 는 이 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 stub
l0=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, true
lamp1=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);
else
g.setColor(Color.RED);
g.fillOval(temp.x, temp.y, 20, 20);
}
}
}
welcome panel 클래스:
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 stub
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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-...
콘 솔 의 출력 결 과 는 다음 과 같 습 니 다.
예측 결과 에 부합 하여 실험 이 완성 되 었 습 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.