1.进程:
运行程序,首先会将代码放在内容区域里面的代码区里面,代码放在代码区并没有马上执行,但是这个时候已经有一个进程在准备,进程产生后,但是代码还是没有运行,这就是一个进程,进程是一个静态概念;运行中的应用程序都是进程,拥有内存和CPU资源;我们常说的进程开始运行,实际上是进程里面的主线程在开始运行也就是说系统来调用main,就产生一个主线程,在我们机器上运行的实际上是线程;
2.线程的概念:
线程实际上就是进程里面的一段代码,一个进程可以有多段代码,线程本身是不占任何资源的(共享进程的资源)线程就是一个程序里面的不同执行路径;
3.线程和进程的区别:
每个进程都有自己独立的代码和进程空间,进程间进行切换,开销比较大;线程可以看成是轻量级的进程,同一类线程共享代码和数据空间;每个线程有独立的线程栈和计数器;线程间进行切换,开销比较小;多进程:在操作系统中运行多个任务;多线程:在同一个应用程序中,有多个流程同时执行;
4.CPU是如何分配线程任务?
CPU运行速度非常快,一秒钟可以执行几亿次;CPU将自己的时间分成了很多小的时间片段,某一个时间在执行某一个线程,下一个时间又在执行下一个线程;虽然系统可能有几十个线程,但是由于速度非常快,给用户的感觉就是同时在运行;什么才是真正的多线程呢?你的电脑是多个CPU,或者双核、四核;这才是真正意义上的多线程;
5.JAVA中线程的创建:(两种方式)
java.lang.Thread类;这个类用来表示一个线程,创建也是用Thread类来创建;创建线程有两种方案:1.写一个类继承Thread类,需要重写run方法;2.写一个类实现Runnable接口,也需要重写当前的run方法;
6.线程优先级概念:***
程序运行的顺序,并不是按照创建线程的顺序来运行的,而是通过优先级来控制的;java线程的优先级:java提供了一个线程调度器来监控线程的运行,监控处于就绪状态的线程;线程调度器按照线程的优先级来决定调度哪一个线程进行执行;线程的优先级使用数字来表示的,1-10,线程的缺省值就是5(默认赋值为5);优先级的值越大,表示优先级越高,main函数的优先级默认也是5,程序运行的结果是由虚拟机来控制的;我们自己无法控制的,所以线程的优先级值指定相对值,理论上优先级越高的会首先占据运行的权利;但是实际上我们获取到的结果并不是优先级越高的会完全占据运行的权利;线程的运行和运行环境的息息相关;总结:具有高优先权的线程会分配更多的运行资源;
7.线程的状态:***
1.新建状态:当线程对象创建过后,就处于新建状态; Thread t =new Thread();2.就绪状态(Runnable):当程序调用start()方法,当前线程就处于就绪状态,但是当前线程可能还没有运行;只能说明当前程序准备完成,等待调度器来调用;3.运行状态(Running):当调度器来调度当前这个线程的时候,处于运行状态,此时线程才处于运行;4阻塞状态(Blocked):处于运行状态中的线程,可能因为某些元素放弃对CPU的使用,停止运行;这个时候线程就处于阻塞状态,要回到就绪状态,才能继续执行;5.死亡状态(Dead):线程执行完了或者因为某些异常退出了,该线程就结束了生命周期,等待垃圾回收机制回收;yield()方法让处于运行的线程回到就绪状态,并执行其他线程,其他线程执行完后,再等待调度器调用;sleep()方法让运行的自身线程处于阻塞状态、休眠状态;join()方法让运行的其他线程处于阻塞状态,然后先执行调用了该方法的线程;join():如果两个线程a、b,如果说你想要a线程运行完了再运行在运行b线程,就可以调用join方法来完成,该方法会让当前处于运行状态的线程停止,等待调用了join方法的其他线程执行完了后,再继续执行当前线程;
8.多线程的关系图:
锁机制:当两个或者两个以上的线程要同时访问共享数据的时候,我们必须确保某一时间只能有一个线程来访问;运行这个过程称为同步,锁机制;同步块、同步方法;处于同步方法或者同步块里面的代码要进行等待,我们就调用wait()方法可以让线程处于等待状态,处于等待的线程让出cpu的执行权利,如果没有设置等待时间,那就只能用notify()方法或者notifyAll来唤醒;唤醒后的线程又变成锁定状态;
9.sleep和wait方法区别
sleep方法来自于Thread类,wait方法来自于Object类;哪都可以直接调用sleep方法;wait方法必须在同步方法或者同步块中调用;sleep不会释放对象锁,wait可以进行解锁;线程会释放执行的权利;
转载请注明原文地址: https://www.6miu.com/read-60690.html