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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© LGQ 中级黑马   /  2015-7-22 08:10  /  320 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 LGQ 于 2015-7-22 09:25 编辑

方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。下面是一个例子:
 class hello extends Thread {

    public hello() {

    }

    public hello(String name) {
        this.name = name;
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + "运行" + i);
        }
    }

    public static void main(String[] args) {
        hello h1=new hello("A");
        hello h2=new hello("B");
        h1.run();
        h2.run();
    }

    private String name;
}
  
  这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类,这时如果我们又不想建立一个新的类,应该怎么办呢?
  我们不妨来探索一种新的方法:我们不创建Thread类的子类,而是直接使用它,那么我们只能将我们的方法作为参数传递给 Thread 类的实例,有点类似回调函数。但是 Java 没有指针,我们只能传递一个包含这个方法的类的实例。
  那么如何限制这个类必须包含这一方法呢?当然是使用接口!(虽然抽象类也可满足,但是需要继承,而我们之所以要采用这种新方法,不就是为了避免继承带来的限制吗?)
  Java 提供了接口 java.lang.Runnable 来支持这种方法。
  方法二:实现 Runnable 接口
  Runnable接口只有一个方法run(),我们声明自己的类实现Runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是Runnable接口并没有任何对线程的支持,我们还必须创建Thread类的实例,这一点通过Thread类的构造函数 public Thread(Runnable target);来实现。下面是一个例子:
  class hello implements Runnable {

    public hello() {

    }

    public hello(String name) {
        this.name = name;
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + "运行     " + i);
        }
    }

    public static void main(String[] args) {
        hello h1=new hello("线程A");
        Thread demo= new Thread(h1);
        hello h2=new hello("线程B");
        Thread demo1=new Thread(h2);
        demo.start();
        demo1.start();
    }

    private String name;
}




  
  严格地说,创建Thread子类的实例也是可行的,但是必须注意的是,该子类必须没有覆盖 Thread 类的 run 方法,否则该线程执行的将是子类的 run 方法,而不是我们用以实现Runnable 接口的类的 run 方法,对此大家不妨试验一下。
  使用 Runnable 接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装,它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接用多个类分别继承 Thread 来得紧凑。

7 个回复

倒序浏览
好像运行不了。是不是上传的时候出的问题??
回复 使用道具 举报
lizhichao 发表于 2015-7-22 08:43
好像运行不了。是不是上传的时候出的问题??

我再看看
回复 使用道具 举报
lizhichao 发表于 2015-7-22 08:43
好像运行不了。是不是上传的时候出的问题??

字符是中文输法打出的,我删了重新发
回复 使用道具 举报 1 0
 ("线程 " + number + ":计数 " + count);
     if(++count== 6) return;
    }
   }
这个return是不是应该换成break;
因为return是返回的意思搞反了吧:
  1. public class MyThread extends Thread{
  2.                 private static Runnable i;
  3.                 private int count = 1, number;
  4.                 public MyThread(int num){
  5.                         number = num;
  6.                         System.out.println("创建线程 " + number);
  7.                 }
  8.                 public void run() {
  9.                                  while(true) {
  10.                                         System.out.print("线程 " + number + ":计数 " + count);
  11.                                         count++;
  12.                                          if(count==6){
  13.                                                  System.out.println();
  14.                                                  break ;
  15.                                           }
  16.                                  }         
  17.          }
  18.           public static void main(String args[]) {
  19.                   for(int i = 1 ;i<5;i++){
  20.                           try {
  21.                                 Thread.sleep(10);
  22.                         } catch (InterruptedException e) {
  23.                                
  24.                                 e.printStackTrace();
  25.                         }
  26.                           new MyThread(i).start();
  27.                           
  28.                   }
  29.                
  30.           }
  31. }
复制代码




把我的抄一遍看看(注意不要复制)
public class MyThread extends Thread{
                private static Runnable i;
                private int count = 1, number;
                public MyThread(int num){
                        number = num;
                        System.out.println("创建线程 " + number);
                }
                public void run() {
                                 while(true) {
                                        System.out.print("线程 " + number + ":计数 " + count);
                                        count++;
                                         if(count==6){
                                                 System.out.println();
                                                 break ;
                                          }
                                 }         
         }
          public static void main(String args[]) {
                  for(int i = 1 ;i<5;i++){
                          try {
                                Thread.sleep(10);
                        } catch (InterruptedException e) {
                               
                                e.printStackTrace();
                        }
                          new MyThread(i).start();
                          
                  }
               
          }
}
1我给你的程序加了一个休眠;
2把程序的new MyThread(i+1)改成了MyThread(i);[code]public class MyThread extends Thread{
                private static Runnable i;
                private int count = 1, number;
                public MyThread(int num){
                        number = num;
                        System.out.println("创建线程 " + number);
                }
                public void run() {
                                 while(true) {
                                        System.out.print("线程 " + number + ":计数 " + count);
                                        count++;
                                         if(count==6){
                                                 System.out.println();
                                                 break ;
                                          }
                                 }         
         }
          public static void main(String args[]) {
                  for(int i = 1 ;i<5;i++){
                          try {
                                Thread.sleep(10);
                        } catch (InterruptedException e) {
                               
                                e.printStackTrace();
                        }
                          new MyThread(i).start();
                          
                  }
               
          }
}

就是在退出的时候换成了break在退出前又加了一个换行效果如图

第一图.png (138.08 KB, 下载次数: 2)

第一图.png
回复 使用道具 举报 1 0
lizhichao 发表于 2015-7-22 09:34
 ("线程 " + number + ":计数 " + count);
     if(++count== 6) return;
    }

学习了,在看一些视频,确实是为了技术分而来,多谢指出,再次感谢:handshake
回复 使用道具 举报 1 0
LGQ 中级黑马 2015-7-22 09:53:41
7#
lizhichao 发表于 2015-7-22 09:34
 ("线程 " + number + ":计数 " + count);
     if(++count== 6) return;
    }

话说我的这个里边大多都是中文字符,层主还是很叼的
回复 使用道具 举报
LGQ 发表于 2015-7-22 09:53
话说我的这个里边大多都是中文字符,层主还是很叼的

互相学习 互相支持 吗!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马