进程是动态的,程序时静态的,程序运行起来就产生了进程,而线程是由进程创建的,是进程的一个实体,一个进程可以有多个线程。
并发时,某一个时间点只执行一个任务,电脑里并发和并行可能同时存在
1.线程的创建和使用:
Thread类里的run方法是实现了Runnable接口的run方法
程序运行时,即Application进程开始运行,创建main线程,main线程创建子线程Thread-0,当子线程运行时main线程不会阻塞,会同时运行
2.为什么调用start方法?
直接调用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();
/* 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);
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 />(2)start0()方法是本地方法,private native void start0();<br />该方法由JVM调用,底层是C/C++实现的,所以真正实现多线程的不是run方法而是start0()方法
3.继承Thread类和实现Runnable接口的区别
4.线程的终止
基本说明:
1.当线程完成任务后,会自动退出
2.还可以通过使用变量来控制run方法退出的方式来停止线程,即通知方式
5.线程的中断
6.线程的插队
7.用户线程和守护线程
使用setdeamon方法设置,先成为守护线程,在启动线程,否则会抛异常
8.线程的七大状态
官方给的文档里面显示的是6种状态,有的把Runnable状态分为Ready(就绪态)和Running(运行态),所以称为七种状态。
9.线程同步机制 Synchronized
10.互斥锁
10.线程死锁
多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程时一定要避免死锁的发生
12.释放锁
链接:https://www.nowcoder.com/questionTerminal/1ecf3ca506d74384be091b1d6a6d1cb9
来源:牛客网
线程共享的进程环境包括:
进程代码段
进程的公有资源(如全局变量,利用这些共享的数据,线程很容易的实现相互之间的通信)
进程打开的文件描述符
消息队列
信号的处理器
进程的当前目录
进程用户ID
进程组ID
线程独占资源:
线程ID
寄存器组的值
用户栈、内核栈(在一个进程的线程共享堆区(heap))
错误返回码
线程的信号屏蔽码
线程的优先级
SQL的优化 索引 索引的失效或不失效