zoukankan      html  css  js  c++  java
  • 传统的线程技术

    线程并不是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接口更加符合面向对象编程时思想。

  • 相关阅读:
    如何编译Linux内核
    svn
    windows live writer …
    SVN服务器配置
    使用PowerDesigner创建数据库表图文并茂版
    maven学习
    在PreparedStatement中设置空值
    今天, 我的博客正式开通啦.
    Neo4j简介
    clinit和init(转载)
  • 原文地址:https://www.cnblogs.com/lcngu/p/5140612.html
Copyright © 2011-2022 走看看