Live2D

JAVA-线程-学习笔记

线程
概述:
1、进程:当前操作系统执行的任务。
2、一般而言,现在操作系统都是多进程的。
3、线程:进程中的子任务。
4、在实际应用中,都是多线程的场景。
5、线程本身是CPU上执行,CPU的每一个核在同一时刻内只能执行一个线程,
但是CPU在底层会对线程进行快速的轮询切换。
6、每一个进程中至少包含1个线程。
7、线程在执行任务的过程中大概可以认为分为两大块:
1、在CPU上执行。
2、和计算机的硬件进行交互。当线程和硬件进行交互(例如读取文
件)是不占用CPU的。
8、多线程的意义:提高CPU的利用率。理论上,当线程个数足够多的时候,
CPU的利用率是能够到达100%。其实不可能达到100%,只会无限趋近于100%。

定义线程:
1、继承Thread,重写run方法,将需要的逻辑放到run方法中,然后创建线程
对象调用start方法来开启线程。
(run和start的区别:
在main方法执行过程中,遇到start方法会开辟一条新的通路执行
start,同时main方法同步继续执行,因此所有的线程都是同步的。
run方法,对于main函数而言只是一段程序所需要的逻辑,并不会另
开新路,走完run内部逻辑之后,才继续执行main函数。

2、实现Runnable接口。重写run方法,然后利用Runnable对象来构建Thread
,然后调用start方法。
3、实现Callable<T>,重写call方法。

多线程的并发安全问题:

1、线程之间是相互抢占执行,而且抢占是发生在线程执行的每一步。
2、由于线程的抢占而导致出现了不合理的数据的现象-多线程的并发安全问
题。

线程中的锁机制:
1、为了解决线程并发问题,引入了synchronized代码块 - 同步代码块。
2、同步代码块需要一个锁对象。
3、锁对象:要求被当前的所有线程都认识---共享资源---方法区中的所有资
源都可以用来当锁来用。
4、this作为锁对象的时候,要求传入的必须是同一个Runnable。
5、同步:在同一时刻内资源/逻辑只被一个线程占用/执行。
6、在同一时刻内资源/逻辑可以被多个线程抢占使用。
7、同步一定安全,不安全一定是异步。
8、死锁:由于多个线程之间的锁形成了嵌套而导致代码无法继续允许,这种
现象称之为死锁 DeadLock
9、实际开发中,会做死锁的检验,如果真的出现死锁,会根据线程的优先级
打破其中一个锁或多个锁。


线程的优先级:
1、讲线程的优先级分为了1-10,10个等级。
2、理论上,数字越大优先级越高,那么抢到资源的概率就越大。
3、实际上,相邻两个优先级之间的差别不明显;如果想要相对明显一点,至
少要相差5个优先级。


等待唤醒机制:
1、利用标记位以及wait、notify方法来调节线程之间的执行顺序。
2、wait、notify、notifyAll方法来调节线程之间的执行顺序。
2、wait、notify、notifyAll和锁有关、用哪个对象作为锁对象使用,那么
就用锁对象来调用wait、noticy


线程的状态:
五种状态:
创建 阻塞 就绪 运行 消亡

守护线程:
1、守护其他的线程,只要被守护的线程结束,那么守护线程就会随之结束。
2、一个线程要么是守护线程,要么是被守护线程。
3、守护线程可以守护其他的守护线程。
4、在java中,最常见的一个守护线程是GC。

总结:线程产生的场景
1、系统自启
2、用户请求
3、线程之间的启动

总结:线程销毁场景
1、寿终正寝。
2、他杀(被其他线程销毁)。
3、意外:线程因为报错崩溃而退出。

总结:
1、sleep:在使用的时候需要制定休眠时间,单位是毫秒,到点自然醒。 在
无锁状态下,会释放CPU,在有锁状态下,不释放CPU。sleep方法是设计在了Thread类
上,所以sleep是个静态方法。
2、wait:可以指定等待时间,也可以不指定。wait方法是设计在了Object类
上。如果不指定等待时间,就无限期等待知直到被唤醒。wait必须结合锁来用,当线
程在wait的时候会释放锁。

扩展:方法区和线程
1、类是存储在方法区中,方法区是被所有的线程共享的空间。
2、每一个线程独有一个栈内存。

 

posted @ 2019-09-04 21:58  Mr丶L  阅读(229)  评论(1编辑  收藏  举报