每个新的线程都是实现Runnable接口的类或者其扩展类的一个对象。这种新的对象被称为可运行的对象。可以通过扩展Thread类或者实现Runnable接口创建线程。
1:通过扩展Thread类创建线程
例子代码:
public class TestThread {
public static void main(String[] args) {
// TODO Auto-generated method stub
PrintChar printA = new PrintChar('a', 100);
PrintChar printB = new PrintChar('b', 100);
PrintNum print100 = new PrintNum(100);
print100.start();
printA.start();
printB.start();
}
}
class PrintChar extends Thread{
private char charToPrint;
private int times;
public PrintChar(char c, int t){
charToPrint = c;
times = t;
}
public void run(){
for(int i = 0; i < times; i++){
System.out.print(charToPrint);
}
}
}
class PrintNum extends Thread{
private int lastNum;
public PrintNum(int n){
lastNum = n;
}
public void run(){
for(int i = 1; i <= lastNum; i++){
System.out.print(" "+i);
}
}
}
2:通过实现Runnable接口创建线程
通过声明一个扩展Thread类的用户线程类创建并运行了一个线程。如果这个用户线程类只继承Thread类的话,那么这种方法是适用的,但是如果它继承多个类的话,则这种方法不适用,比如在一个applet的情况中。为了继承多个类,您必须实现多个接口。java提供Runnable接口作为Thread类的一种替代。
例子代码:
public class TestRunnable {
public static void main(String[] args) {
// TODO Auto-generated method stub
new TestRunnable();
}
public TestRunnable(){
Thread printA = new Thread(new PrintChar('a', 100));
Thread printB = new Thread(new PrintChar('b', 100));
Thread print100 = new Thread(new PrintNum(100));
print100.start();
printA.start();
printB.start();
}
class PrintChar implements Runnable{
private char charToPrint;
private int times;
public PrintChar(char c, int t){
charToPrint = c;
times = t;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0; i < times; i++){
System.out.print(charToPrint);
}
}
}
class PrintNum implements Runnable{
private int lastNum;
public PrintNum(int n){
lastNum = n;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1; i <= lastNum; i++)
System.out.print(" "+i);
}
}
}
扩展Thread类的那个类的一个实例是一个线程,使用Thread类中的start()方法可以启动它。但是实现Runnable接口的类的实例不是线程。必须使用Thread类包装它来为这个实例构造线程,比如 Thread printA = new Thread(new PrintChar(‘a’, 100));