Let's Go!

Java多线程的简单实例

上一篇 / 下一篇  2009-04-28 17:34:43 / 个人分类:JAVA学习&编程相关

一 通过Thread类创建线程
 

//ch02.OurClass.java
public class OurClass extends Thread {
    public void run() ...{
        for (int I = 0; I < 100; I++) {
            System.out.println("Hello");
        }
    }
}

//ch02.OurApplet.java
import java.applet.Applet;

public class OurApplet extends Applet {
    public void init() {
        OurClass c = new OurClass();
        oc.start();
    }
}
 start()方法实际上创建了一个新的线程。这个新的线程,在进行了一些初始化操作后调用run()方法。在run()方法运行结束后,该程序还作了一些与程序终止相关的工作。因而,在新线程中运行的run()方法大概是在start()方法返回到第一个线程的同时开始运行的。

创建一个线程两个步骤:


在子类中覆盖run()方法;

通过构造函数创建子类的一个对象并调用子类的start()方法;

==========================================================

二 使用Runnable接口的线程
对于一个已经有着详细继承树关系的类而言,如果想让它在自己的线程中运行,就不能如上那样使其从Thread类继承而来。Java中使用接口的机制来解决其不支持多重继承的缺陷。

实际上,线程化的类实现了Runnable接口。因此,当一个类继承自Thread类时,其子类也同时实现了Runnable接口。

简单地说,我们可以通过实现Runnable接口来代替从Thread类继承。

第一步:只需将 extends Thread  替换为 implements Runnable

 

//ch02.OurRunnableClass.java

public class OurRunnableClass implements Runnable ...{
    public void run() ...{
        for (int I = 0; I < 100; I++) ...{
            System.out.println("Hello, from another thread");
        }
    }
}
第二步:因为OurRunnableClass不再是Thread对象,不能使用默认的构造函数创建线程。不过可以通过OurRunnableClass对象的引用创建新的线程对象。

 

//ch02.OurRunnableApplet.java

import java.applet.Applet;

public class OurRunnableApplet extends Applet ...{
    public void init() ...{
        Runnable t = new OurRunnableClass();
        Thread th = new Thread(ot);
        th.start();
    }
}
 为什么会有这样一个构造函数呢?前面曾经提过Thread类的run()方法默认实现是一个空方法。代码如下:

 

public void run() ...{
           if ( target != null ) ...{
                      target.run();
           }
}
target其实就是传递给线程的构造函数的可运行对象(实现了Runnable接口的对象)。

有趣的是,通过使用Runnable接口而不是继承自Thread类的技术,第一步的OurClass类的代码可以和第二步的applet融合在一起了。

 如下所示:

 

import java.applet.Applet;

public class OurCompleteApplet extends Applet implements Runnable ...{
    public void init() ...{
        Thread th = new Thread(this);
        th.start();
    }

    public void run() ...{
        for (int I = 0; I < 100; I++) ...{
            System.out.println("Hello, from another thread");
        }
    }
}

 

===============================================

改写实例:

//线程子类
public class OurClass extends Thread {
    public void run() {
        for (int I = 0; I < 10; I++) {
            System.out.println("Hello");
        }
    }
}

//主体类
import java.applet.Applet;

public class OurApplet extends Applet {
   
    //public void init()
   
    public static void main(String[] args)
    {
        OurClass c = new OurClass();
        oc.start();
        OurClass oc2 = new OurClass();
        oc2.start();
    }
}

==============================================================

Runnable接口的实例化,区别


 


TAG:

 

评分:0

我来说两句

Open Toolbar