Java创建线程的两种方式

  1. 扩展Thread类。
  2. 实现Runnable接口来创建线程。
    java的重要功能之一就是天然的支持多线程(multithreading)。类Thread事实上实现了Runnable接口。

1.扩展Thread类创建线程

要创建一个线程,首先要定义一个Thread类的扩展类,自定义的线程类必须覆盖run()方法,该方法告知系统如何执行线程。然后创建一个在线程上运行的对象。
实例:编写一个程序,创建并运行三个线程:第一个线程打印字母a,100次;第二个线程打印字母b,100次;第三个线程打印从1到100的整数。

package thread;

public class TestThread {
    public static void main(String[] args){
        //create threads
        PrintChar printA = new PrintChar('a',100);
        PrintChar printB = new PrintChar('b',100);
        PrintNum print100 = new PrintNum(100);
        //start threads
        printA.start();
        printB.start();
        print100.start();
    }

}

package thread;

public class PrintChar extends Thread {
    private int count;
    private char charToPrint;
    ///Construct a thread to print character
    public PrintChar(char a,int n){
        charToPrint = a;
        count = n;
    }
    ///override run()
    public void run(){
        for(int i = 0;i<=count;i++){
            System.out.print(charToPrint);
        }
    }

}
package thread;

public class PrintNum extends Thread {
    private int lastNum;
    ///Construct a thread for print 1,2,3..
    public PrintNum(int num){
        lastNum = num;
    }
    public void run(){
        for(int i=1;i<=lastNum;i++){
            System.out.print(" "+i);
        }
    }

}

运行结果如下:
a 1bbbbbbbbbbbbbbb 2a 3b 4a 5b 6a 7b 8a 9b 10 11a 12b 13a 14b 15a 16b 17a 18b 19aaaaaaaaaaaaaaaaa 20b 21a 22b 23a 24b 25a 26bb 27 28a 29bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 30a 31b 32aaaaaaaaaaa 33b 34a 35b 36a 37b 38a 39bbbbbbbbb 40a 41b 42a 43b 44 45 46 47 48 49 50 51 52 53 54 55 56aa 57a 58a 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

2.实现Runnable接口创建线程

通过声明Thread类扩展的用户线程类,创建和运行了一个线程。如果用户线程仅继承了Thread类,这种做法就很好。但是如果它要继承别的类,必须实现Runnable接口。Runnable接口只包含run()方法。如要利用Runnable接口启动一个线程,必须先创建实现Runnable接口类的实例,然后使用Thread类的构造方法构造一个线程。
实例如上,实现方法如下:

package threadRunnable;

public class TestRunnable {
    ///create threads
    Thread printA = new Thread(new PrintChar('a',100));
    Thread printB = new Thread(new PrintChar('b', 100));
    Thread print100 = new Thread(new PrintNum(100));
    public static void main(String[] args){
        new TestRunnable();
    }
    public TestRunnable(){
        printA.start();
        printB.start();
        print100.start();

    }

}

package threadRunnable;

public class PrintNum implements Runnable {
    private int times;
    ///construct a thread
    public PrintNum(int n) {
        // TODO Auto-generated constructor stub
        times = n;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i=0;i<=times;i++){
            System.out.print(" "+i);
        }

    }

}
package threadRunnable;

public class PrintChar implements Runnable {
    private int times;
    private char charToPrint;
    public PrintChar(char c,int n) {
        // TODO Auto-generated constructor stub
        times = n;
        charToPrint = c;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i=0;i<=times;i++){
            System.out.print(charToPrint);
        }

    }

}

运行结果如下:
aaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

总结:
如果一个类是从Thread类扩展而来的,则它的实例是一个线程,使用Thread类中的start()方法就可以启动该线程。如果一个类仅仅实现一个Runnable接口,它的实例还不是一个线程,必须使用Thread类对它进行包装,为该实例创建一个线程。

你可能感兴趣的:(java)