目录
两种方式:继承Thread类、实现Runnable接口。
继承Thread类
创建线程步骤:
- 定义类继承Thread。
- 复写Thread类中的run()方法。
目的:将自定义代码存储在run()方法,让线程运行。
3.调用线程的start方法。
该方法两个作用:1.启动线程;2.调用run()方法。
运行结果:
每一次都不同
因为多个线程都获取CPU的执行权,CPU执行到谁,谁就运行。
明确一点,在某个时刻,只能有一个程序在运行(多核除外)。
我们可以形象把多线程的运行行为看作互相抢夺CPU的执行权。
这就是多线程的一个特点:随机性:谁抢到谁执行,至于执行多长时间,CPU说了算。
重写run()方法原因:
Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run()方法。也就是说,Thread类中的run()方法,用于存储线程要运行的代码。
扩展:
创建好一个线程,使用start()方法和run()方法的区别:
start():开启线程并执行该线程的run()方法。
run():仅仅是对象调用方法。而线程创建了,并没有执行。
实现Runnable接口
创建线程步骤:
- 自定义类实现Runnable接口
- 覆盖Runnable接口中的run()方法
将线程要运行的代码存放在该run()方法中。
3.通过Thread类建立线程对象。
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
要将Runnable接口的子类对象传递给Thread的构造函数的原因:
自定义的run()方法所属的对象是Runnable接口的子类对象,所以要让线程去执行指定对象的run()方法,就必须明确该run()方法所属对象。
5.调用Thread类的start()方法开启线程并调用Runnnable接口子类的run()方法。
实现Runnable和继承Thread两种方式的区别
- 实现Runnable接口避免了单继承的局限性,因此在定义线程时,建议使用实现方式。
- 继承Thread,线程代码存放在Thread子类run()方法中,实现Runnable,线程代码存放在Runnable接口实现类的run()方法中。