一、程序、进程以及线程的理解
程序:含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也可以理解为程序是静态的代码。
进程:是系统运行程序的基本单位,是程序的一次执行过程,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。
线程:与进程相似,但线程是一个比进程更小的执行单位,也可以称为轻量级进程。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源(当多个线程对同一个资源出现争夺时候要注意线程安全的问题),所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多。
二、守护线程与非守护线程
Java 中的线程分为两种:守护线程(Daemon)和用户线程(User)。
1)任何线程都可以设置为守护线程和用户线程,通过方法
Thread#setDaemon(boolean on)设置。true则把该线程设置为守护线程,反之则为用户线程。2)
Thread#setDaemon(boolean on)方法,必须在Thread#start()方法之前调用,否则运行时会抛出异常。3)判断虚拟机(JVM)何时离开,Daemon 是为其他线程提供服务,如果全部的 User Thread 已经撤离,Daemon 没有可服务的线程,JVM 撤离。
两者的区别是:
程序运行完毕,JVM 会等待非守护线程完成后关闭,但是 JVM 不会等待守护线程。
三、多线程的上下文切换
多线程会共同使用一组计算机上的 CPU ,当线程数大于给程序分配的 CPU 数量时,为了让各个线程都有执行的机会,就需要轮转使用 CPU 。不同的线程切换使用 CPU 发生的切换数据等,就是上下文切换。
1)在上下文切换过程中,CPU 会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后继续运行。在程序中,上下文切换过程中的 “当前程序运行的具体位置” 信息是保存在进程控制块(PCB)中的。PCB还经常被称作“切换桢”(switchframe)。“当前程序运行的具体位置” 信息会一直保存到CPU的内存中,直到他们被再次使用。
2)上下文切换是存储和恢复 CPU 状态的过程,它使得线程执行能够从中断点恢复执行。上下文切换是多任务操作系统和多线程环境的基本特征。
四、线程调度算法
有两种调度模型:分时调度模型和抢占式调度模型。
分时调度模型是指让所有的线程轮流获得 CPU 的使用权,并且平均分配每个线程占用的 CPU 的时间片这个也比较好理解。
抢占式调度模型,是指优先让可运行池中优先级高的线程占用 CPU ,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用 CPU 。处于运行状态的线程会一直运行,直至它不得不放弃 CPU 。Java 虚拟机采用采用的就是抢占式调度模型。
多线程的并发运行,指各个线程轮流获得 CPU 的使用权,分别执行各自的任务。
另:并发编程和并行编程有什么区别?
并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
或者也可以理解为:并行是在不同实体上的多个事件;并发是在同一实体上的多个事件。
所以并发编程的目标是,充分的利用处理器的每一个核,以达到最高的处理性能。
五、线程状态以及相互转换

六、在 Java 中获取线程堆栈
-
kill -3 [java pid]不会在当前终端输出,它会输出到代码执行的或指定的地方去。比如,
kill -3 tomcat pid, 输出堆栈到 log 目录下。 -
Jstack [java pid]这个比较简单,在当前终端显示,也可以重定向到指定文件中 (jstack 2222 > jstack.log)。
-

本文详细阐述了程序、进程及线程的概念与区别,探讨了Java中守护线程与非守护线程的作用与设定方式,解释了多线程上下文切换的原理与线程调度算法,并介绍了线程状态转换与获取线程堆栈的方法。
114

被折叠的 条评论
为什么被折叠?



