JAVAEE 初阶 多线程基础(三)

启动,中断,等待基础

    • 一.如何创建线程
    • 二.启动线程 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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述