启动,中断,等待基础
- 一.如何创建线程
- 二.启动线程 start()
- 1.1 调用两次start方法
- 1.2 创建新对象解决多个start问题
- 2.1 经典面试题 run和start的区别
- 三.中止线程
- 3.1 引入标志位
- 3.2 高级写法
- 3.3高级写法的错误之处
- 3.4问题的解决
- 3.5 将标志位放在main的局部变量中是否可行
- 四.等待线程 join
一.如何创建线程
1.通过继承Thread类
2.通过实现Runnable接口
3.继承Thread类,重写Run方法
4.实现Runnable,重写Run方法
5.lambda表达式
二.启动线程 start()
1.1 调用两次start方法
那么我们如何解决呢?
1.2 创建新对象解决多个start问题
2.1 经典面试题 run和start的区别
run方法在main主线程中,而start是创建一个新的线程
那么我们看下如下效果吧
表面上看执行效果一样,那么我们变换一下代码就可以看出不同/
三.中止线程
3.1 引入标志位
3.2 高级写法
3.3高级写法的错误之处
3.4问题的解决
在这种写法中,会报出一个异常,那么怎么解决呢?
有interrupt的存在,会将sleep方法提前唤醒
1.sleep提前唤醒会清除标志位,使得在异常之后继续执行
2.抛出interruptedException异常
3.只需要加上break就不会再报错
3.5 将标志位放在main的局部变量中是否可行
答案当然是不可行的,因为会存在变量捕获这一概念,所谓的变量捕获,就是其中的内容不可改变,但是这里的标志位是要改变的,所以不能放在main的局部变量中.
为什么必须写成成员变量呢?
因为成员变量lambda表达式是和匿名内部类息息相关,内部类的成员访问外部变量本身就是可以的.
四.等待线程 join