目录
创建线程
继承Thread类,重写run()方法
实现Runnable接口,重写run()方法
继承Thread类,重写run()方法,使用匿名内部类
实现Runnable接口,重写run()方法,使用匿名内部类
使用lambda表达式
启动线程
调用start()方法启动线程
run()和start()都是Thread类中的方法,run()是线程的执行体,它只是普通的方法调用,不会创建新线程。调用start()方法JVM会创建出一个新线程,并在新线程中主动去调用run()方法,start()方法只能调用一次,通过start()方法创建新线程,从而实现并发编程的效果。
线程中断
在Java中中断一个线程,做法比较唯一,就是让run()方法尽快执行结束
通过isInterrupted()方法获取Thread对象内部的标志位 interrupt()方法把Thread对象内部的标志位设置为true. 通过设置标志位来中断一个线程。
如果线程正在sleep,interrupt()方法可以使sleep内部触发一个异常,从而提前被唤醒。interrupt唤醒线程之后,sleep方法抛出异常之后,同时会自动清除设置好的标志位。 这样设定的目的可以让线程收到中断信号的时候,能够自由决定接下来该如何处理。
线程等待
通过join()实现让一个线程等待另一个线程执行结束,再继续执行。本质上是控制线程执行结束的顺序 。
1.在A线程中执行B.join(),那么A线程就会被阻塞,等待B线程执行结束才开始执行
2.如果线程执行结束,调用join直接就返回了
3.可以通过join(long mills)设置等待的时间,避免死等的现象发生
线程休眠
调用sleep方法需要手动处理异常。线程会按照设定的时间休眠,但是sleep存在一定的精度误差(ms级) ,线程从阻塞态转换为就绪态会有一个调度的开销,可以忽略不计。
获取线程实例
通过currentThread()获取当前线程对象的引用