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); } } }
时间: 2024-11-05 16:35:10