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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Executors.newSingleThreadExecutor()和Executors.newScheduledThreadPool(1)的区别?不只是简单的理解为第一个是单线程,第二个是线程池中只有一个线程吧?

3 个回复

倒序浏览
首先,很明显的区别是Executors.newScheduledThreadPool(1)它可安排在给定延迟后运行命令或者定期地执行。两个方法返回的结果都不同。

回复 使用道具 举报
你猜对了。就这么简单,名称长的吓人。

newSingleThreadExecutor():创建一个只有单线程的线程池。返回类型是ExecutorService对象,该对象代表一个线程池。用于执行Runnable内的run。

第二个一样,创建指定数目线程的线程池。系统随机选择一个空闲的线程执行Runnable内的run。
该对象可以用于指定延迟后再周期性的执行线程内容。

第一个不具备延迟功能,也没有周期执行功能(额外添加的不算)。

这里有张老师的交通灯示例,我加了注释:
  1. //定时器:每10秒钟将当前灯变红,并且将下一个灯变绿;
  2.                 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  3.                 timer.scheduleAtFixedRate(
  4.                                 //周期要做的事
  5.                                 new Runnable(){

  6.                                         @Override
  7.                                         public void run() {
  8.                                                 System.out.println(System.currentTimeMillis());
  9.                                                 //返回的下一个灯作为当前灯
  10.                                                 currentLamp = currentLamp.lightOut();
  11.                                         }
  12.                                        
  13.                                 },
  14.                                 10, //第一次执行的延迟时间
  15.                                 10, //周期为10秒
  16.                                 TimeUnit.SECONDS//周期的单位
  17.                 );
复制代码
张老师的
回复 使用道具 举报
你是不是要说Executors.newSingleThreadExecutor()和Executors.new FixedThreadPool(1)的区别啊?
这两个是等效的,但是有区别,下面给你解释一下,本人的一点小见解,希望大家共同交流
楼主首先应该明确:
线程池中有三类池子:
        cache池子-->newCachedThreadPool;设置有定时清除池中超过60s(默认)的线程,
        所以这个池中的线程可以不用担心它线程是否结束
        fixed池子-->newFixedThreadPool;newFixedThreadPool与cacheThreadPool差不多,
        也是能reuse就用,但不能随时建新的线程 -其独特之处:任意时间点,最多只能有
        固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,
        直到当前的线程中某个线程终止直接被移出池子
        Scheduled池子-->newScheduledThreadPool;这个调度线程池子中的线程可以按照Schedule设置的周期依次执行。
而newSingleThreadExecutor()-->为单例线程,即任意时间点,线程池中只能有一个线程在活动,
它使用的线程池使用的是底层池,这个底层池和cache池、fixed池这个两个池子使用了相同的底层池。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马