学习内容:
1、线程与进程
2、同步与异步&并发与并行
3、继承Thread
4、实现Runnable
5、实现Runnable与继承Thread相比有哪些优势
6、设置和获取线程名称
7、线程休眠sleep
8、线程的中断
9、线程安全1-同步代码块
10、线程安全2-同步方法
11、线程安全3-显示锁Lock
12、线程的六种状态
13、线程池概述
14、缓存线程池
15、定长线程池
16、单线程线程池
17、周期定长线程池
18、Lambda表达式
学习时间:2天
学习产出:
1、 技术笔记 1 遍
2、CSDN 技术博客 1 篇
3、 学习的 vlog 视频 1 个
一、线程与进程
1.1.进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
1.2.线程:线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行。一个进程最少有一个线程
线程实际上实在进程基础之上的的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程
二、同步与异步&并发与并行
2.1.同步:排队执行,效率低但是安全
2.2.异步:同时执行,效率高但是数据不安全
2.3.并发:指两个或多个事件在同一个时间段内发生
2.4.并行:指两个或多个时间在同一时刻发生(同时发生)
三、继承Thread
3.1.Thread类是java.lang包中的一个类,Thread类的对象用来代表线程,通过继承Thread类创建、启动并执行一个线程的步骤如下:
(1)创建一个继承Thread类的子类;
(2)覆写Thread类的run()方法;
(3)创建线程类的一个对象;
(4)通过线程类的对象调用start()方法启动线程。
代码如下:
四、实现Runnable接口
4.1.如果当前类不仅要继承其他类,还要实现多线程,那么继承Thread类肯定不行,因为Java不支持多继承。在这种情况下,只能通过当前类实现Runnable接口来创建Thread类对象
使用Runnable接口启动新线程的步骤如下:
(1)创建Runnable对象;
(2)使用参数为Runnable对象的构造方法创建Thread对象;
(3)调用start()方法启动线程。
代码如下:
五、实现Runnable与继承Thread相比有哪些优势
(1)通过创建任务,然后给线程分配的方式来实现的多线程,更适合多个线程同时执行相同任务的情况;
(2)可以避免单继承所带来的局限性;
(3)任务与线程本身是分离的,提高了线程的健壮性;
(4)后续学习的线程池技术,接收Runnable类型的任务,不接受Thread类型的线程。
六、设置和获取线程名称
6.1.我们可以使用Thread.currentThread().getName()的方法来获取线程名称
6.2.使用参数为Runnable对象的构造方法创建Thread对象;利用Thread创建的对象调用setName()属性来设置线程名称
代码如下:
七、线程休眠sleep
能控制线程行为的方法之一是调用sleep()方法,sleep()方法可以指定线程休眠的时间,线程休眠的时间以毫秒为单位。
代码如下:
八、线程的中断
我们可以调用Thread类中interrupt()方法来实现线程的中断
示例代码如下:
九、线程安全1-同步代码块
在Java中提供了同步机制,可以有效地防止资源冲突。同步机制使用synchronized关键字,使用该关键字的代码块称为同步块,语法如下:
synchronized(Object){
}
示例代码如下:
十、线程安全2-同步方法
同步方法就是被synchronized关键字修饰的方法,其语法如下:
synchronized void f(){
}
示例代码如下:
十一、线程安全3-显示锁Lock
显示锁Lock,子类ReentrantLock
以及公平锁和非公平锁
ReentrantLock fair参数为true表示为公平锁
示例代码如下:
十二、线程的六种状态
线程状态。 线程可以处于以下状态之一:
NEW
尚未启动的线程处于此状态。
RUNNABLE
在Java虚拟机中执行的线程处于此状态。
BLOCKED
被阻塞等待监视器锁定的线程处于此状态。
WAITING
无限期等待另一个线程执行特定操作的线程处于此状态。
TIMED_WAITING
正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。
TERMINATED
已退出的线程处于此状态。
线程在给定时间点只能处于一种状态。 这些状态是虚拟机状态,不反映任何操作系统线程状态。
十三、线程池概述
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池就是一个容纳多个线程的容器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。
线程池的好处:
(1)降低资源消耗;
(2)提高响应速度
(3)提高线程的可管理性
十四、缓存线程池
缓存线程池特点:(长度无限制)
任务加入后的执行流程:
(1)判断线程池是否存在空闲线程;
(2)存在则使用;
(3)不存在,则创建线程并放入线程池,然后使用。
示例代码如下:
十五、定长线程池
定长线程池的特点:(长度是指定的数值)
任务加入后的执行流程:
(1)判断线程池是否存在空闲线程;
(2)存在则使用;
(3)不存在空闲线程,且线程池未满的情况下,则创建线程并放入线程池,然后使用;
(4)不存在空闲线程,且线程池已满的情况下,则等待线程池存在空闲线程
关键代码如下:
十六、单线程线程池
执行流程:
(1)判断线程池的那个线程是否空闲;
(2)空闲则使用;
(3)不空闲,则等待,池中的单个线程空闲后使用
关键代码如下:
十七、周期定长线程池
执行流程:
(1)判断线程池是否存在空闲线程;
(2)存在则使用;
(3)不存在空闲线程,且线程池未满的情况下,则创建线程并放入线程池,然后使用;
(4)不存在空闲线程,且线程池已满的情况下,则等待线程池存在空闲线程
周期性任务执行时:定时执行,当某个时机触发时,自动执行某任务。
1.定时执行一次
参数1.定时执行的任务
参数2.时长数字
参数3.时长数字的时间单位,TimeUnit的常量指定
示例代码如下:
2.周期性执行任务
参数1.任务
参数2.延迟时长数字(第一次执行在什么时间以后)
参数3.周期时长数字(每隔多久执行一次)
参数4.时长数字的单位
示例代码如下:
十八、Lambda表达式
Lambda表达式
函数式编程思想
面向对象:创建对象调用方法解决问题
代码格式如下:
Thread t = new Thread(()->System.out.println(""));
t.start();
<-------------------------------------END------------------------------------------->