多线程的创建方式
- 定义 Thread 类的子类创建
/**
* @author: kent
* @date: 2018/4/18 09:40
*/
public class WelcomeApp {
public static void main(String[] args) {
//create new thread
Thread welcomeThread = new WelcomeThread();
welcomeThread.start();
System.out.printf("1. Welcome ! I'm %s.%n",Thread.currentThread().getName());
}
}
class WelcomeThread extends Thread{
@Override
public void run(){
System.out.printf("2. Welcome ! I'm %s.%n",Thread.currentThread().getName());
}
}
多次执行程序得到的结果可能不同
- 创建 Runnable 接口实例
/**
* @author: kent
* @date: 2018/4/18 09:48
*/
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());
}
}
多次执行程序得到的结果可能不同
避免应用代码直接调用线程的 run 方法
/**
* @author: kent
* @date: 2018/4/18 10:32
*/
public class WelcomeApp2 {
public static void main(String[] args) {
Thread welcomeThread = new Thread(new Runnable() {
@Override
public void run() {
System.out.printf("2. welcome ! I'm %s.%n",Thread.currentThread().getName());
}
});
welcomeThread.start();//启动线程
welcomeThread.run();//直接调用,其实运行在main线程里面
System.out.printf("1. welcome ! I'm %s.%n",Thread.currentThread().getName());
}
}
多次执行程序得到的结果可能不同
比较两种创建方式
从面向对象的角度来说:第一种创建方式(创建Thread的子类)是一种基于继承(Inheritance)的技术,第二种创建方式(以Runnable接口实例为构造器参数直接通过 new 创建 Thread 实例)是一种基于组合的(Composition)技术,由于组合相对于继承来说耦合性(Coupling)更低,因此更加灵活。组合是优先选用的技术