1、Java.Thread

1.1简介

1.1.1 程序、进程、线程

程序是指令和数据的有序集合。
进程(Process)执行程序的一次执行过程,是一个动态的概念。是系统资源分配的单位。
线程(Thread)一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位。
多线程指多个CPU,即多核,如服务器。如果是模拟出来的多线程,即在一个CPU下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错觉。
在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程
main()称为主线程,为系统的入口,用于执行整个程序
在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的。
对同一份资源操作时,会存在资源抢夺问题,需要加入并发控制
线程会带来额外的开销,如cpu调度时间,并发控制开销
每个线程在自己的工作内存交互,内存控制不当会造成数据不一致的问题。

1.2实现

image.png

1.2.1 继承Thread类

继承Thread类,重写run方法,在调用start方法启动时,会自动执行run方法中的逻辑值得一提的是,Thread类也是实现了Runnable接口

1.2.2 实现Runnable接口

实现Runnable接口,实现他的Run方法,配合Thread类使用,Runnable接口的对象,作为参数传递给Thread类的构造器,然后调用Thread类的Start方法。

1.2.3 实现Callable接口

Callable接口是带泛型的,也就是说可以返回一个我们指定类型的执行结构,实心callable接口后,实现他的call方法,实例化callable接口后,需要实例化一个FutureTask类,其中,callable接口的对象作为参数传入,接着在实例化一个Thread类,将FutureTask对象作为参数传入,调用Thread对象的start方法,开启线程,调用futureTask对象的get方法,得到返回结果。

1.2.4 Run方法和Start方法的区别

1.位置
run方式是重写自Runnable接口,因为Thread类也是重写了runnabe接口,start方法就是位于Thread类
2.类型
run方法是非同步方法,start是同步方法,也就是说多个线程同时执行start方法的时候不会出现线程安全问题,因为start方法生命中有synchronized关键字
3.作用
run方法的作用是存放业务逻辑,start方法的作用是启动线程,线程启动后,会自动的执行run方法
4.线程数量
run方法在执行过程中,不会产生新的线程
start方法在执行过程中会产生一个新线程
image.png
5.方法调用多次
run方法可以被调用无数次,start方法只能被调用一次,线程只能别启动一次
image.png
image.png

1.2.5优雅的停止线程

线程中断标记
interrupt方法,标记当前线程为中断状态,要配合isinterrupted或者interrupted方法一起使用
image.png

1.3线程状态

1.4线程同步

1.5线程同步

1.6线程通信问题

1.7线程高级

2.IO