一 通过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接口的实例化,区别