A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

张老师的代码基本上不怎么耗费cpu。
下面是我自己的代码,非常占用cpu。
不知有什么工具能帮忙找出耗费cpu的代码?
  1. import java.util.*;
  2. public class Traffic{
  3.         public static void main (String[] args){
  4.                 //定义一个字典,准备用来建立Road对象,不然会搞死人
  5.                 String[] dics = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
  6.                 //两句话建立12个road对象,爽
  7.                 for(int i = 0; i <dics.length;i++){
  8.                         new Road(dics[i]);
  9.                 }
  10.                 //建立交通灯控制对象
  11.                 LampController lc =  new LampController();
  12.                 //设置初始灯为S2N
  13.                 Lamp currentLamp = Lamp.S2N;
  14.                 //交通灯控制对象在主线程中
  15.                 while (true){
  16.                         //每11秒对把当前的绿灯关闭,返回下一组灯。
  17.                         mySleep(11000);
  18.                         currentLamp = lc.offLamp(currentLamp);
  19.                 }
  20.         }
  21.         //避免多次try catch,定义一个mysleep方法。
  22.         public static void mySleep(long millinSec){
  23.                 try {
  24.                         Thread.sleep(millinSec);
  25.                 }
  26.                 catch(Exception e){
  27.                 }
  28.         }
  29. }
  30. //交通灯控制,很简单,就一个方法,关闭灯。
  31. class LampController{
  32.         Lamp Lamp;
  33.         LampController(){
  34.         }
  35.         Lamp offLamp(Lamp lamp){
  36.                 return lamp.setBlank();
  37.         }
  38. }

  39. class Road{
  40.         private String name= null;
  41.         //因为是先进先出,所以只适用列表的头和尾,所以使用LinkedList,另外加上同步代码保证线程安全。
  42.         private List<Integer> cars = Collections.synchronizedList( new LinkedList<Integer>());
  43.         //一生成Road对象,就开始来车和车通过的线程。
  44.         Road(String name){
  45.                 this.name =name;
  46.                 Thread t1 = new Thread(new RoadAddCar(name, cars));
  47.                 Thread t2 = new Thread(new RoadCarPass(name, cars));
  48.                 t1.start();
  49.                 t2.start();
  50.         }
  51. }
  52. //实现Runnable接口,准备来车的线程
  53. class RoadAddCar implements Runnable{
  54.         //定义使用到的变量,用于构造函数和打印结果。
  55.         private String name ;
  56.         private Integer carID = 1;
  57.         private List<Integer> cars;
  58.         //传入路名和车的队列。
  59.         RoadAddCar(String name,List<Integer> cars){
  60.                 this.name = name;
  61.                 this.cars = cars;
  62.         }
  63.         public void run(){
  64.                 while (true){
  65.                         //0.5秒-2.5秒时间,随机来车。来一辆车就打印一次。
  66.                         cars.add(carID);
  67.                         System.out.println(name+"来车ID:" + carID);
  68.                         carID = carID + 1;
  69.                         Traffic.mySleep((long)(Math.random()*2000 + 500));
  70.                 }
  71.         }

  72. }
  73. //实现Runnable,准备车通行的线程
  74. class RoadCarPass implements Runnable{
  75.         private List<Integer> cars;
  76.         private String name ;
  77.         private Integer carID;
  78.         //构造函数传入路名和车的队列。
  79.         RoadCarPass(String name,List<Integer> cars){
  80.                 this.name = name;
  81.                 this.cars = cars;
  82.         }
  83.         public void run (){
  84.                 while (true){
  85.                         //如果绿灯则考虑通行
  86.                         if (Lamp.valueOf(name).isLighted()){
  87.                                 //当然这条路还得有车才行。
  88.                                 if (cars.size() > 0){
  89.                                         carID = cars.remove(0);
  90.                                         //因为是只有花1秒时间通过了路口,才会打印结果,所以会在运行结果中看到,红灯亮了,车才通过。
  91.                                         //因为Lamp.setBlank()中,红灯亮了,过1秒之后,下组灯的绿灯才会亮,所以不会出现交通事故。
  92.                                         Traffic.mySleep(1000);
  93.                                         System.out.println("  "+name+"路,ID:"+carID+"通过路口,耗时1000毫秒");
  94.                                 }
  95.                         }
  96.                         //因为如果此路口是红灯,则上述判断不成立,如果下面不休息,系统资源消耗过大。
  97.                         else
  98.                                 Traffic.mySleep(1000);
  99.                 }
  100.         }
  101. }
  102. //枚举,虽然在基础视频上没有讲,但这两个面试题,让我觉得枚举很有用。这个题目做完之后,对枚举的认识有提高了。
  103. enum Lamp{
  104.         //定义了每个灯所对应的灯和下一个灯,默认为红灯。
  105.         S2N("N2S","S2W",false),        S2W("N2E","E2W",false),        E2W("W2E","E2S",false),        E2S("W2N","S2N",false),
  106.         N2S("S2N","N2E",false),        N2E("S2W","W2E",false),        W2E("E2W","W2N",false),        W2N("E2S","N2S",false),
  107.         //右转的路的都为绿灯
  108.         S2E(null,null,true),        E2N(null,null,true),        N2W(null,null,true),        W2S(null,null,true);
  109.         private String opposite = null;
  110.         private String next = null;
  111.         private boolean lighted = false;
  112.         //Lamp对象的构造方法。
  113.         Lamp(String opposite,String next,boolean lighted){
  114.                 this.opposite = opposite;
  115.                 this.next = next;
  116.                 this.lighted = lighted;
  117.         }
  118.         public boolean isLighted(){
  119.                 return this.lighted;
  120.         }
  121.         public String nextLamp(){
  122.                 return this.next;
  123.         }
  124.         //开绿灯,打印到控制台
  125.         private void setL(Lamp lamp){
  126.                 lamp.lighted = true;
  127.                 System.out.println("== "+lamp.name() + "路绿灯亮,车辆可以通过");
  128.         }
  129.         private void setLight(){
  130.                 //一次开2个绿灯,比感觉比递归更容易让人理解
  131.                 setL(this);
  132.                 setL(valueOf(this.opposite));
  133.         }
  134.         //开红灯,打印到控制台
  135.         private void setO(Lamp lamp){
  136.                 lamp.lighted = false;
  137.                 System.out.println("XX "+lamp.name() + "路红灯亮,车辆停止");
  138.         }
  139.         public Lamp setBlank(){
  140.                 //一次开2个红灯,比感觉比递归更容易让人理解
  141.                 setO(this);
  142.                 setO(valueOf(this.opposite));
  143.                 //因为车辆通过需时1秒,所以在红灯亮了之后1s,才打开下一轮灯的绿灯。
  144.                 Traffic.mySleep(1000);
  145.                 valueOf(this.next).setLight();
  146.                 return valueOf(this.next);
  147.         }
  148.        
  149. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马