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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import java.util.Random;  
  4. import java.util.concurrent.ExecutorService;  
  5. import java.util.concurrent.Executors;  
  6. import java.util.concurrent.ScheduledExecutorService;  
  7. import java.util.concurrent.TimeUnit;  
  8.   
  9. /**  
  10. * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。  
  11. * 每条路线上随机增加新的车辆,增加到一个集合中保存。  
  12. * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。  
  13. * @author 张孝祥 www.it315.org  
  14. *  
  15. */  
  16. public class Road {  
  17.     private List<String> vechicles = new ArrayList<String>();  
  18.       
  19.     private String name =null;  
  20. /*在这个构造函数中,传回哪个方向的车,  
  21. 先开启一个线程池用于产生车辆,一个定时器用于观察交通灯状态*/  
  22.     public Road(String name){  
  23.         this.name = name;  
  24.          
  25.         //模拟车辆不断随机上路的过程   
  26.        //使用线程池,通过产生单个线程的方法,创建一个线程池   
  27.         ExecutorService pool = Executors.newSingleThreadExecutor();  
  28.   //  
  29.         pool.execute(new Runnable(){  
  30.             public void run(){  
  31.                 for(int i=1;i<1000;i++){  
  32.                     try {  
  33.                         Thread.sleep((new Random().nextInt(10) + 1) * 1000);  
  34.                     } catch (InterruptedException e) {  
  35.                         e.printStackTrace();  
  36.                     }  
  37.                     vechicles.add(Road.this.name + "_" + i);  
  38.                 }                 
  39.             }  
  40.               
  41.         });  
  42.          
  43.         //每隔一秒检查对应的灯是否为绿,是则放行一辆车      
  44.    //产生一个单线程,创建定时器   
  45.         ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);  
  46.         timer.scheduleAtFixedRate(  
  47.                 new Runnable(){  
  48.                     public void run(){  
  49.    //判断路上是否有车,有则进行相应的操作  
  50.                         if(vechicles.size()>0){  
  51.                             boolean lighted = Lamp.valueOf(Road.this.name).isLighted();  
  52. //每隔1秒让车通行,通行前要先判断灯是否亮,亮了才能通行,即从集合中移除   
  53.                             if(lighted){  
  54.                                 System.out.println(vechicles.remove(0) + " is traversing !");  
  55.                             }  
  56.                         }  
  57.                           
  58.                     }  
  59.                 },  
  60.                 1,  
  61.                 1,  
  62.                 TimeUnit.SECONDS);  
  63.          
  64.     }  
  65. }  
复制代码
一个线程增加车辆,一个线程减少车辆,操作的是同一个集合,会不会存在线程安全问题。是不是应该使用Collections的 synchronizedList(List list)方法,让集合变成安全的?

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

3 个回复

正序浏览
不好意思哦...忘了张老师的怎么写的了....因为我自己写的时候写的synchronized
我以为他也写了
可以参考下我写的..有什么好的建议告诉我哦
http://bbs.itheima.com/thread-111492-1-1.html
回复 使用道具 举报
osully 发表于 2014-4-4 21:55
函数上有synchronized

只有一个构造函数,哪里有sychronized()
回复 使用道具 举报
函数上有synchronized
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马