线程的创建和运行

Java提供了两种方式来创建线程:

  • 继承Thread类,并且覆盖run()方法。

  • 创建一个实现Runnable接口的类。使用带参数的Thread构造器来创建Thread对象。

这里我们只以Runnable接口为例:

package concurrency;

public class Test1 {
    public static void main(String[] args) {
        for(int i = 1; i <= 10; i++) {
            Calculator calculator = new Calculator(i);
            Thread thread = new Thread(calculator);
            thread.start();
        }
    }
}

class Calculator implements Runnable {
    private int number;
    public Calculator(int number) {
        this.number = number;
    }
    @Override
    public void run() {
        for(int i = 1; i <= 10; i++) {
            System.out.printf("%s:  %d * %d = %d\n", 
                    Thread.currentThread().getName(),number,i,i*number);
        }
    }
}

当调用Thread对象的start()方法时,另一个执行线程将被创建。因而在我们的程序中,每次调用start()方法时,都会创建一个执行线程。

当一个程序的所有线程都运行完成时,更明确的说,当所有非守护(non-daemon)线程都运行完成的时候,这个Java程序将宣告结束。如果初始线程(执行main()方法的线程)结束了,其余的线程仍将继续执行直到它们运行结束。如果某一个线程调用了System.exit()指令来结束程序的执行,所有的线程都将结束。

对一个实现了Runnable接口的类来说,创建Thread对象并不会创建一个新的执行线程;同样的,调用它的run()方法,也不会创建一个新的执行线程。只有调用它的start()方法时,才会创建一个新的执行线程。

编写一个类并继承Thread类,在这个类里覆盖run()方法,然后创建这个类的对象,并且调用start()方法,也会创建一个执行线程,如例:

package concurrency;

public class Test2 extends Thread {
    private int number;
    public Test2(int number) {
        this.number = number;
    }
    public static void main(String[] args) {
        for(int i = 1; i <= 10; i++) {
            Test2 thread = new Test2(i);
            thread.start();
        }
    }
    @Override
    public void run() {
        for(int i = 1; i <= 10; i++) {
            System.out.printf("%s:  %d * %d = %d\n", 
                    Thread.currentThread().getName(),number,i,i*number);
        }
    }
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。