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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王浩骅 中级黑马   /  2013-5-11 16:56  /  2190 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘胜寒 于 2013-5-18 03:30 编辑

ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
                timer.scheduleAtFixedRate(
                                new Runnable(){
                                        public void run(){
                                                if(vechicles.size()>0){
                                                        boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
                                                        if(lighted){
                                                                System.out.println(vechicles.remove(0) + " is traversing !");
                                                        }
                                                }
                                                
                                        }
                                },
                                1,
                                1,
                                TimeUnit.SECONDS);
               
        }
}

谁来帮我讲解一下这段代码的中那些计时的方法?或者曾经在哪段视频中有(面试题的视频那段除外,那个说的太快了)。谢谢

点评

楼主我趁这黑夜给你结贴,希望楼主海涵。楼主问题解决了吧。 否则的话,接着让他未解决吧。。  发表于 2013-5-18 03:29

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 Super_Class 于 2013-5-11 18:52 编辑
  1.         根据情况来定,每隔一定时间检查一次该路上的灯是否为绿灯,如果为绿,车辆通行。(间隔为1秒)
  2. 方法一        直接使用定时器
  3.         new Timer().scheduleAtFixedRate(new TimerTask() {  //这个地方,你也不需要理解这个类是,只要了解这个地方目的就是处理一个任务,它也需要覆盖run()方法
  4.                         
  5.                         public void run() {
  6.                                 boolean lighted = Lamp.valueOf(Road.this.name).islighted(); //Enum的方法valueOf方法返回Enum 对象
  7.                                 if(lighted){
  8.                                         System.out.println(vechcies.remove(0)+" is travering!");
  9.                                 }                                
  10.                         }
  11.                 },
  12.                 1,
  13.                 1);
  14.         
  15. 方法二        使用线程池
  16. ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  17.                 timer.scheduleAtFixedRate(
  18.                                 new Runnable() {
  19.                                         public void run() {
  20.                                                 boolean lighted = Lamp.valueOf(Road.this.name).islighted();
  21.                                                 if(lighted){
  22.                                                         System.out.println(vechcies.remove(0)+" is travering!");
  23.                                                 }
  24.                                         }
  25.                                 },
  26.                                 1,
  27.                                 1,
  28.                                 TimeUnit.SECONDS);
  29.         }
  30. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
Executors工厂类用来产生连接池,该工厂类里包含几个静态工厂方法创建连接池:
newCachedThreadPool();创建一个具有缓存功能的线程池,系统根据需要创建线程,
这些线程将会被缓存在线程池中。
newFixedThreadPool(int n);创建一个可重用的具有固定线程数的线程池。
newSingleThreadExecutor();创建一个只有单线程的线程池,相当于
newFixedThreadPool(1);
newScheduledThreadPool(int n);创建具有指定线程数的线程池,它可以
在指定延迟后执行线程任务,。
newSingleThreadScheduledExecutor();创建一个只有一条线程的线程池,
它可以在指定延迟后执行线程任务。
上面五个方法中前三个方法返回一个ExecutorService对象,该对象代表一个线程池,
它可以执行Runnable对象或Callable对象所代表的线程,而后两个方法返回一个
ScheduledExecutorService线程池,它是ExecutorService的子类
它可以在指定延迟后执行线程任务。

ExecutorService里面提供了如下三个方法:
submit(Runnable t):将一个Runnable对象提交给指定的线程池。线程池将在有空闲线程时执行
Runnable对象代表的任务。
submit(Runnable t,T r);将一个Runnable对象交给指定的线程池。
线程池将在有空闲线程时执行Runnable对象所代表的任务,r显式
指定线程执行结束后的返回值。
submit(Callable t);将一个Callable对象交给指定的线程池。线程池将在有空闲线程时执行Callable对象所代表的任务

ScheduledExecutorService代表可在指定延迟或周期行执行
线程任务的线程池。它提供几个方法如下:
schedule(Callable c,long delay,TimeUnit u);
指定c任务将在delay延迟后执行。u是时间的单位。
schedule(Runnable r,long delay,TimeUnit u);
指定r任务将在delay延迟后执行。
scheduleAtFixedRate(Runnable r,long initialDelay ,long period,TimeUnit u);
r任务将在delay延迟后执行,而且以设定频率重复执行。也就是说。在initialDelay后
开始执行,依次在initialDelay+period、initialDelay+2*period...处重复执行。
scheduleWithFixedDelay(Runnable r,long initialDelay ,long period,TimeUnit u);
创建并执行一个在给定初始延迟后首次启用的定期操作。如果任务的任一次执行时
遇到异常,就会取消后续的执行。否则只能通过程序显式取消或终止该任务。
其他的你可以看看API学习。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1 最好解释一下问题中的代码

查看全部评分

回复 使用道具 举报
明天,你好 发表于 2013-5-12 01:19

额,介个...高手的小号吗?都这么专业...
回复 使用道具 举报
如果问题解决,及时结贴。。把未解决变成以解决
回复 使用道具 举报
谢谢帮我结贴,好几天都没来论坛了,这段日子过得唉!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马