当前位置: 首页 > 图文教程 > Java技术 > Java基础 > Java中多线程的实现

Java基础
java基础:小编浅谈java对象
Java基础:孙鑫谈Java中文乱码问题产生原因分析(一)
Java基础:孙鑫谈Java中文乱码问题产生原因分析(二)
Java基础:小编谈JDBC
Java基础:小编详谈Java编码规则并不是老生常谈
Java基础:小编详谈AOP概念
Java基础:小编谈java多维数组
Java基础:小编谈Javascript之DOM的使用(25条)
Java基础:小编杂谈动态语言
Java基础:程序员之家七月份Java基础总结
Java基础:XHTML中css+div布局(经典8条)
Java基础:小编浅谈Spring基于三大模板的Web表示层技术
Java基础:浅谈多线程那点事
Javai基础:浅谈封装的那些事
Java基础:小编浅谈JavaScript中自定义函数那些事
Java基础:小编谈JavaScript中使用原型来创建对象
Java基础:CSS那些事
Java基础:小编对JavaScript的一些认识
Java基础:小编浅谈JavaScript与Java区别何在
Java基础:小编谈继承的语法

Java基础 中的 Java中多线程的实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-12-26   浏览: 81 ::
收藏到网摘: n/a

我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切!

 

真是神奇!Java是如何做到这一点的?通过类!作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程,我们以后的讨论都将围绕这个类进行。      

 

那么如何提供给 Java 我们要线程执行的代码呢?让我们来看一看 Thread 类。Thread 类最重要的方法是 run() ,它为Thread 类的方法 start() 所调用,提供我们的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它! 

 

方法一:继承 Thread ,覆盖方法 run() 

 

我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。

 

下面是一个例子:

 

package demoerror;

 

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 == 6)return;

    }

  }

 

  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 == 6)return;

    }

  }

 

  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 来得紧凑。 

 

综上所述,两种方法各有千秋,大家可以灵活运用。