zoukankan      html  css  js  c++  java
  • JAVA多线程-继承Thread类和实现Runnable接口的区别

    方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。下面是一个例子: 
    public class MyThread extends Thread {
     
    int count= 1, number;
     
    public MyThread(int num) {
      number 
    = num;
      System.out.println(
    "创建线程 " + number);
     }
     
    public void run() {
      
    while(true) {
       System.out.println(
    "线程 " + number + ":计数 " + count);
       
    if(++count== 6return;
      }
     }
     
    public static void main(String args[]) {
      
    for(int i = 0; i < 5; i++new MyThread(i+1).start();
     }
    }

     这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类,这时如果我们又不想建立一个新的类,应该怎么办呢?


      我们不妨来探索一种新的方法:我们不创建 Thread 类的子类,而是直接使用它,那么我们只能将我们的方法作为参数传递给 Thread 类的实例,有点类似回调函数。但是 Java 没有指针,我们只能传递一个包含这个方法的类的实例。那么如何限制这个类必须包含这一方法呢?当然是使用接口!(虽然抽象类也可满足,但是需要继承,而我们之所以要采用这种新方法,不就是为了避免继承带来的限制吗?)
    Java 提供了接口 java.lang.Runnable 来支持这种方法。

      方法二:实现 Runnable 接口

      Runnable 接口只有一个方法 run(),我们声明自己的类实现 Runnable 接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是 Runnable 接口并没有任何对线程的支持,我们还必须创建 Thread 类的实例,这一点通过 Thread 类的构造函数public Thread(Runnable target);来实现。下面是一个例子:

    public class MyThread implements Runnable {
     
    int count= 1, number;
     
    public MyThread(int num) {
      number 
    = num;
      System.out.println(
    "创建线程 " + number);
     }
     
    public void run() {
      
    while(true) {
       System.out.println(
    "线程 " + number + ":计数 " + count);
       
    if(++count== 6return;
      }
     }
     
    public static void main(String args[]) {
      
    for(int i = 0; i < 5; i++new Thread(new MyThread(i+1)).start();
     }
    }

     严格地说,创建 Thread 子类的实例也是可行的,但是必须注意的是,该子类必须没有覆盖 Thread 类的 run 方法,否则该线程执行的将是子类的 run 方法,而不是我们用以实现Runnable 接口的类的 run 方法,对此大家不妨试验一下。 


      使用 Runnable 接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装,它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接用多个类分别继承 Thread 来得紧凑。
  • 相关阅读:
    spring 之 AOP
    spring 之 动态代理
    为 NSDate 添加扩展类 判断时间
    iOS 日期相关总结
    iOS 请求出现 "Request failed: bad request (400)"
    NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 解决办法
    poj-3302
    辽宁省赛——杨鲁斯卡尔专场-J
    辽宁省赛——杨鲁斯卡尔专场 -F
    zzuli训练赛_05_13-D
  • 原文地址:https://www.cnblogs.com/super119/p/1924555.html
Copyright © 2011-2022 走看看