继承Thread类创建线程
通过继承Thread类的方法,来创建并启动多线程的步骤如下:
- 定义Thread类的子类MyThread,并重写该类的run()方法,该方法的方法体定义的是线程需要完成的任务,run()方法也称为线程执行体;
- 创建Thread子类的实例,也就是创建了线程对象;
- 通过调用线程的start()方法启动线程。
实现Runnable接口创建线程
通过实现Runnable接口的方法,创建并启动线程步骤如下:
- 定义Runnable接口的实现类,同样要重写run()方法这是线程的执行体,Thread中的run()方法相同。
- 创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象。
- 通过调用线程对象的start()方法来启动线程。
Thread与Runnable的区别:
1.Runnable避免了单继承局限,可以同时实现多了接口,Thread是Runnable接口的子类。
2.使用Runnabe实现多继承可以更好地描述出程序共享的概念。
3.Runnable采用了代理设计模式,(在静态代理模式中有两个角色一个真实角色用来实现真正的业务操作,另一个代理角色用来完成资源的调动,辅助真实业务的完成)
4.Runnable底层还是调用的Thread的run方法,Thread是把线程和任务合并在了一起,Runnable是把线程和任务分开了,用 Runnable 更容易与线程池等高级 API 配合
5.无论是继承Thread还是Runnable接口创建线程,线程执行完后不返回结果
具体代码实现块:
public static void main(String[] args) {
/**
* 继承Thread实现线程
*/
Thread thread1 = new Thread("thread1"){
@Override
public void run() {
log.debug("thread1");
}
};
thread1.start();
/**
* 第二种 实现Runnable接口
* 相比继承Thread把【线程】和【任务】(要执行的代码)分开
*/
Runnable runnable = new Runnable() {
public void run(){
log.debug("thread2");
}
};
//使用java8实现后可以使用新语法
//Runnable runnable =() -> log.debug("thread2");
Thread thread2 = new Thread(runnable,"thread2");
thread2.start();
log.debug("main");
}