在Java 平台中创建一个线程就是创建一个Thread 类(或其子类)的实例。Thread 类的start 方法的作用是启动相应的线程。运行一个线程实际上就是让Java 虚拟机执行该线程的run 方法,从而使相应线程的任务处理逻辑代码得以执行。
Thread 类的两个常用构造器是:Thread() 和Thread(Runnable target) 。相应地, Java 语言中创建线程有两种方式。
1.以定义Thread 类子类的方式创建线程
public class WelcomeApp {
public static void main(String[] args) {
// 创建线程
Thread welcomeThread = new WelcomeThread();
// 启动线程
welcomeThread.start();
// 输出“当前线程”的线程名称
System.out.printf("1.Welcome! I'm %s.%n", Thread.currentThread().getName());
}
}
// 定义Thread类的子类
class WelcomeThread extends Thread {
// 在该方法中实现线程的任务处理逻辑
@Override
public void run() {
System.out.printf("2.Welcome! I'm %s.%n", Thread.currentThread().getName());
}
}
2.以创建Runnable 接口实例的方式创建线程
public class WelcomeApp1 {
public static void main(String[] args) {
// 创建线程
Thread welcomeThread = new Thread(new WelcomeTask());
// 启动线程
welcomeThread.start();
// 输出“当前线程”的线程名称
System.out.printf("1.Welcome! I'm %s.%n", Thread.currentThread().getName());
}
}
class WelcomeTask implements Runnable {
// 在该方法中实现线程的任务处理逻辑
@Override
public void run() {
// 输出“当前线程”的线程名称
System.out.printf("2.Welcome! I'm %s.%n", Thread.currentThread().getName());
}
}
3.两种方式的区别
1.从面相对象编程的角度来看:第一种方式基于继承,第二种方式基于组合。后者类和类之间的耦合性更低,更加灵活,优先选用。
2.从对象共享的角度来看:笫2种创建方式意味着多个线程实例可以共享同一个Runnable 实例。
3.从对象创建成本的角度来看:Java 中的线程实例是一个“特殊”的Runnable 实例,因为在创建它的时候Java 虚拟机会为其分配调用栈空间、内核线程等资源。因此,创建一个线程实例比起创建一个普通的Runnable 实例未说,其成本要相对昂贵一点。