先放导图吧,蛮多的,一块一块来。
首先这一部分介绍线程的基础知识。
1.线程是什么,线程与进程的关系
2.线程的生命周期
3.线程的好处以及带来的问题
1.线程是什么,线程与进程的关系
1.1进程
进程是程序的一次执行过程,是系统程序运行的基本单位。打开任务管理器,就可以看到很多进程的运行状态。
1.2线程
线程与进程相似,但线程是一个比进程更小的执行单位。一个进程内可能含有很多个线程,这些线程可以共享进程的堆和方法区,有共用的,那肯定就对应着每个线程拥有自己独特的区域:虚拟机栈,本地方法栈,程序计数器。
1.3线程与进程的关系
根据上面的介绍,那么可以看出来,每个进程都包含了一个或者多个线程。
进程相对与线程来说,各个进程之间更加独立,但是线程之间可能会互相影响;再一个,线程的执行开销更加小一些,有利与资源的利用。
在JVM中,同类的多个线程是可以共享进程的堆和方法区的
(图丑勿怪)
最外面的黑框,带表一个进程,里面包含线程所共享的堆和方法区,每一个线程里面都有自己的独有的虚拟机栈,本地方法栈,程序计数器(图中没写出来)
首先是程序计数器,程序计数器的作用是记录当前程序运行到了哪一个未知,对于多线程来说,很多线程是一起跑的,其中会涉及到线程的切换,当一个线程停止运行的时候,程序计数器就会记录该线程运行停止的具体位置,所以对于线程都需要拥有自己的程序计数器。
然后是虚拟机栈和本地方法栈,储存的是线程的局部变量,保证不会被别的线程访问到(这先了解到这,后面写JVM再详细说明)
至于共用的堆与方法区,堆中主要储存new的对象与数组;方法区,主要是加载后的类信息,常量,静态变量等,其中有一个是运行时常量池(比如String str = "AC"; 就是创建在池里面的。哇,发现这个String一个括号写不完,我写完在填。)
2.线程的生命周期.
先放一张百度来的图
其中包含5中状态:新建,就绪,运行,阻塞,死亡。新建的线程,调用start()方法后,就会处于就绪态,当得到cup资源后开始运行,调用sleep()或者wait()/join()后>阻塞,sleep()方法时间到了之后再次变成就绪,如果前面调用的是wait()方法,则需要调用notify()使其变成就绪态,当run()运行完/调用stop()方法后或者线程出错,线程就走向了死亡。
3.多线程的好处以及带来的问题
从系统角度出发,线程是程序执行的最小单位,线程间的切换和调度的成本大大小于进程。而且现在,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。
在实际应用上来看,现在的系统所处理的数据都十分的庞大,多线程并发编程正是开发高并发系统的基础。
至于带来的问题,就想工作的人多了,工作肯定比一个人快,但是又会出现很多新的问题。内存泄漏,死锁,线程不安全等等。
如有问题,请指正,谢谢。