一个线程执行一个顺序程序。在java中,线程通常是java.lang.Thread的子类,它提供了一些方法来创建线程、启动线程。挂起线程、等待线程完成。
首先,创建一个实现Runnable接口的类,该类的run()方法完成所有的工作。例如,下面是一个打印字符串的简单线程。
package lou.thread;
public class HelloWorld implements Runnable {
String message;
public HelloWorld(String m) {
this.message = m;
}
@Override
public void run() {
System.out.println(message);
}
}
我们可以以一个Runnable对象作为参数来调用Thread类的构造函数,将Runnable对象转变为线程,如下所示:
String m = "Hello world form Thread " + i;
Thread thread = new Thread(new HelloWorld(m));
java提供一种语法上的快捷方式,称为匿名内部类,它能让你无需显示地定义HelloWorld类:
final String m = "Hello world form Thread " + i;
thread = new Thread(new Runnable() {
@Override
public void run(){
System.out.println(m);
}
});
上面的程序段创建一个实现Runnable接口的匿名类,其run()方法的行为已描述,当线程创建之后,它需要被启动:
thread.start();
这个方法能使线程运行。调用该方法的线程将立即返回。如果调用者打算等待线程结束,怎必须连接线程:
thread.join();
此时调用者会被阻塞直到线程的run()方法返回。
下面给出一个能够初始化多线程、启动多线程、等待多线程完成、然后打印一条消息的方法。该方法创建一个线程组成的数组。并使用匿名内部类
语法进行初始化。在循环结束时,则创建了一个休眠线程组成的数组。
public static void main(String[] args) throws InterruptedException {
Thread[] thread = new Thread[8];
for (int i = 0; i < thread.length; i++) {
final String message = "Hello from thread " + i;
thread[i] = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(message);
}
});
}
for (int i = 0; i < thread.length; i++) {
thread[i].start();
}
for (int i = 0; i < thread.length; i++) {
thread[i].join();
}
}