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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侯伟浩 黑马帝   /  2011-11-25 09:18  /  2139 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hou3172568 于 2011-11-25 17:13 编辑

看了张老师的关于定时器的应用,产生了一个疑问。

  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("hello");
  18.                 }
  19.         }
  20. }
复制代码
这个是每隔一秒输出一句hello。
  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("hello");
  12.                                         }},
  13.                                 1,
  14.                                 1,
  15.                                 TimeUnit.SECONDS);
  16.         }
  17. }
复制代码
这个也是每隔一秒输出一句hello。
都是线程,完成同样的功能,有什么区别呢?

评分

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

查看全部评分

3 个回复

倒序浏览
第一个只是定义了一个线程,如果起两个或者两个以上的线程,那么它们会并发执行。
第二个定义的是线程池,它可以控制并发执行的线程数,如果达到最大值,那么之后的线程就要处于等待状态,等之前的线程执行完成之后释放池空间,才可进入执行。
ScheduledExecutorService se=Executors.newScheduledThreadPool(1);
你定义的线程池容量为1,也就是说,如果有两个线程同时执行,它们不会并发执行,只能第一个先进去,等执行完毕,释放线程池空间才能让第二个进入。

评分

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

查看全部评分

回复 使用道具 举报
祁焱 黑马帝 2011-11-25 11:53:40
藤椅
创建线程的两种方式:
(1), 继承Thread类
1.子类覆盖父类中的run方法,将线程运行的代码存放在run中。
2.建立子类对象的同时线程也被创建。
3.通过调用start()方法开启线程。
(2),实现Runnable接口
1.子类覆盖接口中的run方法。
2.通过Thread类创建线程,并将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数。
3.Thread类对象调用start方法开启线程
在功能实现上没什么区别,只是因为java是单继承的,所以不可能让所有的类都继承Thread类,所以必须有这个Runnable 接口。
一般来说编程都会去 实现Runnble 接口,而不会采用继承Thread。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 辛苦了!

查看全部评分

回复 使用道具 举报
楼上,感谢你回答我的问题,可是你所答非所问啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马