image.png
进程是动态的,程序时静态的,程序运行起来就产生了进程,而线程是由进程创建的,是进程的一个实体,一个进程可以有多个线程。
截屏2021-08-16 下午4.38.44.png
image.png
并发时,某一个时间点只执行一个任务,电脑里并发和并行可能同时存在

1.线程的创建和使用:

image.png
image.png
Thread类里的run方法是实现了Runnable接口的run方法
image.png
程序运行时,即Application进程开始运行,创建main线程,main线程创建子线程Thread-0,当子线程运行时main线程不会阻塞,会同时运行

2.为什么调用start方法?

image.png
直接调用run方法,则run方法为普通的方法,没有启动新的线程,此时仍然是main线程在运行。
调用start方法的过程是:
(1)第一步是执行Thread类下的start方法,该方法的核心是start0()方法
public synchronized void start() {
_/*
This method is not invoked for the main method thread or “system”
group threads created/set up by the VM. Any new functionality added
to this method in the future may have to also be added to the VM.

A zero status value corresponds to state “NEW”.
*/
_if (threadStatus != 0)
throw new IllegalThreadStateException();

  1. /* Notify the group that this thread is about to be started<br /> * so that it can be added to the group's list of threads<br /> * and the group's unstarted count can be decremented. */<br /> group.add(this);
  2. boolean started = false;<br /> try {<br /> **_start0();_**<br /> started = true;<br /> } finally {<br /> try {<br /> if (!started) {<br /> group.threadStartFailed(this);<br /> }<br /> } catch (Throwable ignore) {<br /> /* do nothing. If start0 threw a Throwable then<br /> it will be passed up the call stack */<br /> }<br /> }<br />}<br />(2start0()方法是本地方法,private native void start0();<br />该方法由JVM调用,底层是C/C++实现的,所以真正实现多线程的不是run方法而是start0()方法

3.继承Thread类和实现Runnable接口的区别

一般情况下最好实现Runnable接口来创建线程类
image.png
image.png

4.线程的终止

基本说明:
1.当线程完成任务后,会自动退出
2.还可以通过使用变量来控制run方法退出的方式来停止线程,即通知方式
image.png

5.线程的中断

image.png
image.png
image.png

6.线程的插队

image.png

7.用户线程和守护线程

截屏2021-08-17 下午3.26.09.png
使用setdeamon方法设置,先成为守护线程,在启动线程,否则会抛异常

8.线程的七大状态

image.png
image.png
官方给的文档里面显示的是6种状态,有的把Runnable状态分为Ready(就绪态)和Running(运行态),所以称为七种状态。

9.线程同步机制 Synchronized

image.png

10.互斥锁

image.png
image.png

10.线程死锁

多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程时一定要避免死锁的发生
image.png
12.释放锁

截屏2021-08-17 下午7.59.42.png
image.png
image.png
链接:https://www.nowcoder.com/questionTerminal/1ecf3ca506d74384be091b1d6a6d1cb9
来源:牛客网

线程共享的进程环境包括:

  • 进程代码段

  • 进程的公有资源(如全局变量,利用这些共享的数据,线程很容易的实现相互之间的通信)

  • 进程打开的文件描述符

  • 消息队列

  • 信号的处理器

  • 进程的当前目录

  • 进程用户ID

  • 进程组ID

线程独占资源:

  • 线程ID

  • 寄存器组的值

  • 用户栈、内核栈(在一个进程的线程共享堆区(heap))

  • 错误返回码

  • 线程的信号屏蔽码

  • 线程的优先级

SQL的优化 索引 索引的失效或不失效