线程的两种启动方式
方法一:直接继承Thread类
step1:创建一个子类,来继承Thread类
step2:重写run()方法,因为这是线程体:当CPU调度执行该线程的时候,就要执行的是run()方法中的代码。
step3:创建该类的对象,表示一个线程,调用start()进而启动这个线程。意味着该线程一切准备就绪,随时可以被CPU调度执行。但是CPU是否立刻执行?不一定,要看CPU自己。
方法二:实现Runnable接口
step1:创建一个实现类,实现Runnable接口
step2:重写run()方法
step3:先创建该实现类对象:mt,根据实现类对象再创建Thread对象,然后启动。
Thread类的构造方法:
Thread();//创建一个线程对象,执行run()。线程的默认名:Thread-0,1,2...
Thread(Runnable target);//创建一个线程对象,指明了target,执行的run是Runnable接口中。
Thread(String name);//创建一个线程,并给起个名字
Thread(Runnable target,String name);
两种线程创建方式的对比
使用Runnable接口:
还可以从其他类继承;
保持程序风格的一致
直接继承Thread类
不能再继承其他的类
编写简单,可以直接操纵线程
使用Runnable接口的方式创建线程时可以为相同程序代码的多个线程提供共享的数据
线程的常用方法
static Thread currentThread() ;//返回对当前正在执行的线程对象的引用。
setName()设置线程名称。系统默认的:Thread-0,Thread-1,Thread-2......
getName() 返回此线程的名称。
long getId() 该Id值,由系统自动分配,程序员无法手动操作。
线程的优先级:priority 最大:10 一般:5 最小:1
int getPriority()
返回此线程的优先级
void setPriority(int newPriority)
更改此线程的优先级。
static void sleep(long millis)
静态方法,应该由类直接调用,对象也可以调用,有坑:不是谁调用就谁睡,而是当前正在执行的线程进入睡眠了。和谁调用无关
join()
等待这个线程终止,在执行其他的线程
setDaemon();
为前台线程服务,如果所有的前台线程都结束了,那么守护线程也就结束了。
线程的状态:
