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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马11期李项京 于 2012-6-3 23:32 编辑

经过本人试验:Executors.newSingleThreadScheduledExecutor()和
Executors.newScheduledThreadPool(1);产生效果其实是一样的,可以互相替换,那张老师为什么不用同一个线程方法呢?
张老师的代码:
  1. //模拟车辆不断随机上路的过程               
  2.                 ExecutorService pool = Executors.newSingleThreadExecutor();
  3.                 pool.execute(new Runnable(){
  4.                         public void run(){
  5.                                 for(int i=1;i<1000;i++){
  6.                                         try {
  7.                                                 Thread.sleep((new Random().nextInt(10) + 1) * 1000);
  8.                                         } catch (InterruptedException e) {
  9.                                                 e.printStackTrace();
  10.                                         }
  11.                                         vechicles.add(Road.this.name + "_" + i);
  12.                                 }                               
  13.                         }
  14.                        
  15.                 });
  16.                
  17.                 //每隔一秒检查对应的灯是否为绿,是则放行一辆车               
  18.                 ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
  19.                 timer.scheduleAtFixedRate(
  20.                                 new Runnable(){
  21.                                         public void run(){
  22.                                                 if(vechicles.size()>0){
  23.                                                         boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
  24.                                                         if(lighted){
  25.                                                                 System.out.println(vechicles.remove(0) + " is traversing !");
  26.                                                         }
  27.                                                 }
  28.                                                
  29.                                         }
  30.                                 },
  31.                                 1,
  32.                                 1,
  33.                                 TimeUnit.SECONDS);
  34.                
  35.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

2 个回复

正序浏览
异曲同工之妙;   
回复 使用道具 举报
两个方法的比较:
newSingleThreadExecutor: 产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。
newScheduledThreadPool(int poolSize): 产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个queue里等待执行
在只有一个线程的时候,他们的作用是一样的。
至于为什么张老师采用newScheduledThreadPool(int poolSize)的方法,我想是为了以后程序在功能扩展的时候更加方便。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马