Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2797403
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: Java

2012-03-15 18:15:58

创建线程的两种传统方式
1、在Thread子类覆盖的run方法中编写运行代码
2、在传递给Thread对象的Runnable对象的run方法中编写代码

  总结:查看Thread类的run()方法的源代码,可以看到其实这两种方式都是在调用Thread对象的run方法,如果Thread类的run方法没有被覆盖,并且为该Thread对象设置了一个Runnable对象,该run方法会调用Runnable对象的run方法。
问题:如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递了一个Runnable对象,那么,线程运行时的执行代码是子类的run方法的代码?还是Runnable对象的run方法的代码:调用子类的。

点击(此处)折叠或打开

  1. package cn.itcast.thread;

  2. public class TraditionalThread {
  3.     /**
  4.      *
  5.      * @param args
  6.      */
  7.     public static void main(String []args){
  8.         /*
  9.          * 如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递了一个Runnable对象,
  10.          * 那么,线程运行时的执行代码是子类的run方法的代码?还是Runnable对象的run方法的代码?
  11.          * 调用子类的方法
  12.          * new Thread(
  13.                 new Runnable(){
  14.                     public void run(){
  15.                         while(true){
  16.                             try {
  17.                                 Thread.sleep(2000);
  18.                             } catch (InterruptedException e) {
  19.                                 e.printStackTrace();
  20.                             }
  21.                             System.out.println(Thread.currentThread().getName());
  22.                             
  23.                         }
  24.                     }            
  25.                 }
  26.         )
  27.         {
  28.             @Override
  29.             public void run(){
  30.                 while(true){
  31.                     try {
  32.                         Thread.sleep(2000);
  33.                     } catch (InterruptedException e) {
  34.                         e.printStackTrace();
  35.                     }
  36.                     //System.out.println(Thread.currentThread().getName());
  37.                     System.out.println("子类:"+this.getName());
  38.                 }
  39.             }
  40.         }.start();*/
  41.         
  42.         new Thread(){
  43.             @Override
  44.             public void run(){
  45.                 while(true){
  46.                     try {
  47.                         Thread.sleep(2000);
  48.                     } catch (InterruptedException e) {
  49.                         e.printStackTrace();
  50.                     }
  51.                     //System.out.println(Thread.currentThread().getName());

  52.                     System.out.println("子类:"+this.getName());
  53.                 }
  54.             }
  55.         }.start();
  56.         
  57.         /*
  58.          * 一个是线程,一个是线程所要运行的代码,
  59.          * 更加面向对象,推荐用这种
  60.          */
  61.         new Thread(new Runnable(){
  62.             public void run(){
  63.                 while(true){
  64.                     try {
  65.                         Thread.sleep(2000);
  66.                     } catch (InterruptedException e) {
  67.                         e.printStackTrace();
  68.                     }
  69.                     System.out.println("实现Runnable:"+Thread.currentThread().getName());
  70.                     //System.out.println(this.getName());这里不能用this,这里this指代Runnable对象是线程的宿主,

  71.                     //不是线程

  72.                 }
  73.             }            
  74.         }).start();
  75.         System.out.println("Thread.currentThread().getName()就是获得当前所有线程的名字:"+Thread.currentThread().getName());
  76.     }
  77. }

  78. 输出:
  79. Thread.currentThread().getName()就是获得当前所有线程的名字:main
  80. 子类:Thread-0
  81. 实现Runnable:Thread-1
  82. 子类:Thread-0
  83. 实现Runnable:Thread-1

 
 
阅读(572) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~