目录
一、进程和线程的概念和区别
二、如何在代码中编写多线程程序
三、如何查看线程的状态
1.线程是什么
一个线程就是一个"执行流",每个线程之间都可以按照顺序执行自己的代码,多个线程之间"同时"执行
着多份代码
1.2为什么要有线程
首先,"并发编程"成为"刚需".
单核 CPU 的发展遇到了瓶颈.要想提高算力,就需要多核 CPU.而并发编程能更充分利用多核 CPU
资源.
有些任务场景需要"等待 10",为了让等待 10 的时间能够去做一些其他的工作,也需要用到并发编程
其次,虽然多进程也能实现 并发编程,但是线程比进程更轻量
创建线程比创建进程更快,
销毁线程比销毁进程更快
调度线程比调度进程更快
最后,线程虽然比进程轻量,但是人们还不满足,于是又有了"线程池"(ThreadPool)和"协程'
(Coroutine)
1.3进程和线程的概念和区别
(1)进程包含线程,一个进程里可以有一个线程,也可以有多个线程,不能没有线程
(2)进程是系统资源分配的基本单位,线程是系统调度执行的基本单位
(3)同一个进程里的线程之间,共用同一份系统资源(内存,硬盘, 网络带宽等....),尤其是"内存资源”,就是代码中定义的变量/对象编程中,多个线程,是可以共用同一份变量的
(4)线程是当下实现并发编程的主流方式,通过多线程, 就可以充分利用好多核 CPU。但是,也不是线程数目越多,就越好,线程数目达到一定程序,把多个核心都利用充分了之后,此时继续增加线程,无法再提高效率,甚至可能会影响效率 (线程调度,也是有开销的)
(5)多个线程之间,可能会相互影响,线程安全问题,一个线程抛出异常,也可能会把其他线程也一起带走
(6)多个进程之间,一般不会相互影响.一个进程崩溃了,不会影响到其他进程,(这一点也成为"进程的隔离性”)
2.1如何在java代码中写多线程程序
(1)线程,本身是操作系统提供的概念,操作系统提供 API, 供程序员调用,不同的系统,提供的 API 是不同的. (Windows 创建线程的 API 和 Linux, 差别非常大)
(2)Java (JVM) 把这些系统API封装好了,咱们不需要关注,系统原生 API, 只需要了解好 Java 提供的这一套 API 就行了
(3)Thread 标准库,在java中这个类就负责完成 多线程 相关的开发
这里我们运用继承Thread类写一个简单的模板
接下来我们完善这个代码并运行
运行结果:
在补全这个代码和运行时的补充事项:
(1) 在写sleep会报错
此处是重写父类的 run ,但父类人家 run没有 throws 这样的异常声明子类重写的时候,也就不能增加 throws
(2)多个线程之间,谁先去 CPU 上调度执行, 这个过程是"不确定的"
(不是数学意义的随机),而是这个调度顺序,取决于操作系统, 内核里,"调度器"的实现,调度器里,有一套规则, 但是咱们作为应用程序开发,没法进行干预,也感受不到,只能把这个过程近似的视为"随机"
(3)注意:上述代码中,run 方法, 并没有手动的去调用,但是最终也执行了,像 run 这种,用户手动定义了,但是没有手动调用,最终这个方法被系统/库/框架进行调用了此时这样的方法, 就称为"回调函数"(callback)
3.1如何查看线程状态
(1)找到所下载的jdk文件
(2) 双击该文件找到
(3)在双击bin找到
(4)打开该文件选择Java程序中的类名
(5) 点不安全连接
(6)就可以查看到线程状态了
注意:
(1)main:代码主线程
一个 Java 进程中, 不止是有 2 个线程,其实还有别的,代码中 t.start() 创建的线程的线程命名的规律就是 Thread-数字
(2)
调用栈,描述了,函数之间/方法之间 调用关系。调用栈,非常有用的东西
比如,你的代码出问题了,抛出异常,进程终止了(崩溃了),此时,查看对应的调用栈,就能知道是哪个代码的哪一行,语句,出现了问题