注:一个方法中的局部内部类若想访问该方法中另外一个局部变量,该变量必须是final的
java.lang.Thread类是线程类,其每一个实例表示一个可以并发运行的线程。我们可以通过继承该类并重写run方法来定义一个具体的线程,其中重写run方法的目的是定义该线程要执行的逻辑
- 线程创建有两种方式:
方式一:继承Thread并重写run方法
优点:定义简单,适合匿名内部类快速创建线程
缺点:*由于Java是单继承的,这就导致继承了Thread就不能再继承其他类,在项目中扩展性差
*由于将线程与执行的任务定义在线程的run方法中, 导致线程与任务有一个强耦合关系,不利于线程重用
方式二:单独定义线程任务的方式:实现Runnable接口,并重写抽象方法run来定义任务 - 代码执行有先后顺序的称为:”同步”执行,同步是在同一个线程中执行的代码
- void run()方法用来定义线程要执行的任务
- 启动线程应当使用线程的void start()方法,而不要直接调用run方法
start方法会快速的执行完毕,作用是将线程纳入线程调度,使其具有并发执行的能力,一旦线程获取CPU时间片开始运行时,会自动调用自己的run方法,需要注意:在概念上不能理解为调用start方法时run方法被执行,而是start方法执行完毕后,该线程的run方法会很快地被执行(一旦获取时间片) - 线程提供了一个静态方法:static Thread currentThread();该方法可以获取运行当前方法的进程
- 获取线程属性的相关API:
String getName();获取名字,long getId();获取ID
int getPriority();获取优先级,boolean isAlive();是否处于活动状态
boolean isDaemon();是否是守护线程,boolean isInterrupted();是否被中断 - 线程优先级:线程不能干涉线程调度的工作,线程不能要时间片,只能被动的被分配,并且分配给哪个线程也是不可控的
改变线程的优先级可以改变时间片分配几率,理论上,线程优先级高的线程获取CPU时间片的次数多 - static void sleep(long ms);该方法会阻塞运行当前方法的线程指定毫秒,当指定时间经过后,线程会重新回到Runnable状态,等待分配时间片并发运行
- void setDaemon();设置为守护线程的静态方法
守护线程:当一个进程中的所有前台线程都结束时,进程结束,无论后台线程(守护线程)是否还在运行都要强制中断 - static void yield();用于使当前线程让出当次CPU时间片回到Runnable状态,等待重新分配时间片
- void join();该方法会阻塞运行该方法的线程,使其在join方法所属线程对象上等待,直到其完成工作才会解除阻塞继续执行,join是同来协调多个线程间同步工作的