线程初级知识点

1.进程:是一个正在执行中的程序每一个进程执行,都有一个执行顺序,该顺序是一个执行路径,或者叫控制单元
注:软件启动,都会在内存中分配一片空间,给一个地址,进程就是用来定义空间,标识空间的,用来封装控制单元

2.线程:就是进程中一个独立的控制单元线程在控制着进程的执行



3.一个进程中至少有一个线程。Java VM启动的时候会有一个进程java.exe,该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中,该线程称之为主线程


4.cpu在某一时刻只能执行某一个程序,但看起来好多程序在同时执行,实则是cpu在不同程序间进行着快速切换,给人得感觉是看起来好像程序是同时进行的


5.以迅雷下载为例,一个下载请求可以开启多个下载路径,如100M的数据,迅雷会默认分为5个部分,同时发出请求,同时开始下载,这样下载的效率会大大提高在该例子中,迅雷下载叫一个进程,而5个下载请求即可称为线程,即线程是进程中的内容


6.扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收的线程有多条路径执行的程序,称为多线程程序,如下载程序


7.多线程的存在意义:多线程的出现可以让程序中的部分出现同时运行的效果,如多线程的下载可以提高效率,多线程的一个应用实例


8.线程的创建:方法一:1.继承Thread类,成为Thread类的子类,
     2.并且重写run()方法目的:将自定义代码存储在run方法,让线程运行
     3.调用线程的start方法作用有俩点,启动线程、调用run()方法
9.为什么要覆盖run方法:Thread类用于描述线程,该类就定义了一个功能,用于存错线程要运行的代码。该存储功能就是run方法也就是说Thread类中的run方法,用于存储线程要运行的代码
10.创建线程的第二种方式:实现Runable接口
步骤:1.定义类实现Runable接口
     2.覆盖Runablle接口中的run方法将线程要运行的代码存放在run方法中
     3.通过Thread类建立线程对象。
     4.将Runable接口的子类对象作为实际参数传递给Thread类的构造函数为什么要将Runable接口的子类对象传递给Thread接口的子类对象所以要让线程去执行指定对象的run方法。就必须明确该run方法所属对象
     5.调用Thread类的start方法开启线程并调用Runable接口子类的run方法
11.实现方式和继承方式的区别:
实现方式好处:避免了单继承的局限性在定义线程时,建议使用实现方式
    区别:  继承Thread类,线程代码存放Thread子类run方法中
实现Runable,线程代码存在接口的子类的run方法 
12.多线程的运行出现了安全问题:
问题的原因:
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误
解决办法:
对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行Java对于多线程的安全问题提供了专业的解决方法,就是同步代码块
synchronized(对象){
   需要被同步的代码
}
上述的对象如同锁。持有锁的线程的线程可以在同步中执行。没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。
13.同步的前提
1.必须要有俩个或者俩个以上的线程
2.必须是多个线程使用同一个锁
   必须保证同步中只能有一个线程在运行
好处:解决了多线程的安全问题
弊端:多个线程需要判断锁,较为消耗资源
14.同步函数用的是哪个锁
函数需要被对象调用。那么函数都有一个所属对象的引用。就是this所以同步函数使用的锁是this
15.静态同步函数用的是哪个锁
静态内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象,类名.class,该对象的类型是Class
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。类名.class

你可能感兴趣的:(线程初级知识点)