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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨永峰 中级黑马   /  2012-5-23 12:49  /  1856 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是关于定时器的代码:

  1. public class My extends Thread {
  2.         public static void main(String args[]) throws Exception
  3.         {
  4.                
  5.                 Thread t1=new My();
  6.                 t1.start();
  7.         }
  8.         public void run()
  9.         {
  10.                 while(true)
  11.                 {
  12.                         try {
  13.                                 Thread.sleep(1000);
  14.                         } catch (InterruptedException e) {
  15.                                 e.printStackTrace();
  16.                         }
  17.                         System.out.println("thread");
  18.                 }
  19.         }
  20. }
复制代码
上面代码段,隔一秒输出一句thread。
  1. import java.util.concurrent.Executors;
  2. import java.util.concurrent.ScheduledExecutorService;
  3. import java.util.concurrent.TimeUnit;


  4. public class My2  {
  5.         public static void main(String args[]) throws Exception
  6.         {
  7.                 ScheduledExecutorService se=Executors.newScheduledThreadPool(1);
  8.                 se.scheduleAtFixedRate(
  9.                                 new Runnable(){
  10.                                         public void run() {
  11.                                                 System.out.println("tread");
  12.                                         }},
  13.                                 1,
  14.                                 1,
  15.                                 TimeUnit.SECONDS);
  16.         }
  17. }
复制代码
这段代码也是隔一秒输出一句 thread
同样都完成了一种功能,有什么区别,理解的不是很透彻


评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 杨梦宇 于 2012-5-23 13:22 编辑

是有区别的,线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
但是如果一个线程的时间非常长那就,就没必要用线程池了。况且还不能控制线程池中线程的开始、挂起、和中止。   

楼主所说的sleep方法,并没有使线程真正的“结束”,而是在停滞状态(线程间同步的时候,用sleep,并没有释放同步锁就可以证明这一点)。
使用线程池,就好比线程池雇佣了几个工人来为池子里面的线程来服务,需要执行的时候我才来服务你,不需要我就去为别人服务或者等待。
针对你的程序,总结一句话:不用线程池,线程一直没有被终止;而使用线程池线程只有在需要的时候被运行

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 楼下继续补充

查看全部评分

回复 使用道具 举报
补充一下楼上的,
楼主是用的sleep方法,一旦线程死掉,就会抛出异常,程序结束
而使用单一线程池的话,线程死掉以后还会给你重新创建一个线程来接着睡。
打个比喻就是,lz需要不停的搬砖,一旦lz累了或者有其它事情,可能就不搬了,而线程池好比一个专门帮人搬砖的公司,每次派一个人来帮忙搬砖,如果那个人出什么事,立马派个新的人来接着干。
至于两者怎么用应该就看lz自己的应用场景了。
回复 使用道具 举报
接着睡说快了。。接着打印
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马