传统的线程技术

线程并不是java1.5以后的新技术,在(java1.5之前)传统的线程创建有两种方式:1)继承Thread类;2)实现Runnable接口。

1)继承Thread类:

 1     Thread thread1 = new Thread(){
 2             @Override
 3             public void run() {
 4                 while(true){
 5                     try {
 6                         Thread.sleep(500);
 7                     } catch (InterruptedException e) {
 8                         // TODO Auto-generated catch block
 9                         e.printStackTrace();
10                     }
11                         System.out.println(Thread.currentThread().getId());
12                 }
13             }
14         };
15         thread1.start();

这种方式是创建Thread的子类,并且覆盖Thread类的run方法。当调用thread的start方法时会执行run方法内的内容。

2)实现Runnable接口:

 1      Thread thread2 = new Thread(new Runnable() {    
 2             @Override
 3             public void run() {
 4                 while(true){
 5                     try {
 6                         Thread.sleep(500);
 7                     } catch (InterruptedException e) {
 8                         // TODO Auto-generated catch block
 9                         e.printStackTrace();
10                     }
11                     System.out.println(Thread.currentThread().getName());
12                 }
13             }
14         });
15         thread2.start();

在查看Thread的源码的时候,发现Thread类的实现源代码会发现Thread类是实现了Runnable接口,其run方式实现如下:

1  @Override
2     public void run() {
3         if (target != null) {
4             target.run();
5         }
6     }

run方法中的target对象在Thread的构造方法中引入:

1 public Thread(Runnable target) {
2         init(null, target, "Thread-" + nextThreadNum(), 0);
3 }

所以继承runnable方法调用的也是run方法。

3)线程创建的扩展:

如果将线程子线程同时覆盖run方法和设置runnable参数如下:

 1       Thread thread3 = new Thread(new Runnable() {
 2             
 3             @Override
 4             public void run() {
 5                 while(true){
 6                     try {
 7                         Thread.sleep(500);
 8                     } catch (InterruptedException e) {
 9                         // TODO Auto-generated catch block
10                         e.printStackTrace();
11                     }
12                     System.out.println("runnable"+Thread.currentThread().getName());
13                 }
14             }
15         }){
16 
17             @Override
18             public void run() {
19                 while(true){
20                     try {
21                         Thread.sleep(500);
22                     } catch (InterruptedException e) {
23                         // TODO Auto-generated catch block
24                         e.printStackTrace();
25                     }
26                     System.out.println("thread"+Thread.currentThread().getName());
27                 }
28             }
29             
30         };
31         thread3.start();

在线程执行中会执行run方法,因为run方法是Thread的子类覆盖父类的方法,于父类run方法没有关系,所有会执行子类的run方法,如果子类没有覆盖父类的run方法,那么就会去执行runnable的run方法。

注意:run方法直接调用并不会创建新的线程,而是在主线程中直接运行run方法,跟普通的方法调用没有任何区别。在实际应用中,实现runnable接口的方式更加常用,因为直接继承Thread类的话,可能比实现Runnable接口看起来更加简洁,但是由于Java只允许单继承,所以如果自定义类需要继承其他类,则只能选择实现Runnable接口。并且实现runnable接口更加符合面向对象编程时思想。

posted @ 2016-01-18 21:49  ngulc  阅读(476)  评论(0编辑  收藏  举报