线程和进程
Posted liqinzhen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程和进程相关的知识,希望对你有一定的参考价值。
进程:在操作系统中运行的程序就是进程,如看视频。
线程:线程就是独立的执行路径。一个进程中可以有多个线程,如视频中听声音,看图像,显示字幕。
多线程:就是指多条路径。
进程与线程的区别:
(1)根本区别:进程是资源分配的基本单位,线程是程序调度和执行的基本单位。
(2)开销:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
线程可以看成轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和
程序计数器(PC),线程切换的开销小。
(3)所处环境:在操作系统中能同时运行多个任务(程序)。
在同一应用程序中有多个顺序流同时执行。
(4)分配内存:系统在运行的时候会为每个进程分配不同的内存区域。
除了CPU之外,不会为线程分配内存(线程所使用的资源是它所属的进程的资源),
线程组只能共享资源。
(5)包含关系:没有线程的进程可以被看成单线程,如果一个进程内拥有多个线程,则执行过程
不是一
条线的,而是多条线(线程)共同完成的。
线程是进程的一部分,所以线程有时被称为轻权进程或者是轻量级进程。
实现多线程的方法:
(1)继承Thread类,重写run()方法:
(2)实现Runnable接口,重写run()方法:
(3)实现Callable接口:
线程的五大状态:新生状态,就绪状态,运行状态,阻塞状态,死亡状态。
注意:(1)线程进入死亡状态之后不能重新开启,重新开启是新的线程。
(2)线程进入阻塞状态之后,重新恢复的话是进入就绪状态。
线程的方法:
线程进入就绪状态的四个原因:
(1)创建线程以后,调用start()方法;
(2)解除阻塞,从阻塞状态恢复;
(3)调用yield()方法,结束中断,礼让线程,让当前正在执行的线程暂停,不是阻塞状态,而是
将线程从运行状态转入就绪状态。
(4)JVM将CPU从本地线程切换到其他线程。
线程进入阻塞状态的四种原因:
(1)调用sleep()方法:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会
让当前线程暂停执行指定时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,
因此休眠时间结束后会自动恢复(线程回到就绪状态)。
(2)调用wait()方法:wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃
对象的锁(线程暂停执行),进入对象的等待池(wait一pool),只有调用对象的notify()
方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果
线程重新获得对象的锁就可以进入就绪状态。
(3)调用join()方法:阻塞指定线程等到另一个线程完成以后再继续执行。合并线程,待此线程
执行完毕后,再去执行其他线程,其他线程阻塞。
(4)io操作中的read和Write。
终止线程的两种方式:
(1)线程正常执行完毕:次数限制;
(2)外部干涉:加入标识。
注意:不要不使用stop和deatory终止线程,不安全。
线程:线程分为用户线程和守护线程。
虚拟机必须等待用户线程执行完毕;
虚拟机不必等待守护线程执行完毕;
守护线程是为用户线程服务的。
以上是关于线程和进程的主要内容,如果未能解决你的问题,请参考以下文章