线程基础知识:
-
线程 和 进程:
- 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体 这样的解释比较的抽象 ,简单的说运行某个软件,相当于开了一个进程,一个程序运行的过程中至少的是有一个进程。
- 线程:线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源 简单的说线程是CPU调度的最小单位 在Java中所说的线程:至少是有两个:一个就是main线程 另一个就是GC线程。 可以使用下面的代码获取
- 进程 和 线程 之间的关系:(面试题)
- 区别:
- 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是系统进行资源分配和调度的一个独立单位。
- 线程是进程的一个实体,是CPU调度和分配的基本单位。线程基本不拥有系统资源,与同一个进程的其他线程共享进程中所拥有的所有资源
- 联系:
- 一个进程可以包括多个线程。
- 在没有实现线程的操作系统中,进程是资源分配的基本单位,又是调度的基本单位,它是系统中并发执行的单元;而在实现了线程的操作系统中,进程是资源分配的基本单位,但是线程是调度的基本单位,是系统中并发执行的单元。
- 区别:
- 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体 这样的解释比较的抽象 ,简单的说运行某个软件,相当于开了一个进程,一个程序运行的过程中至少的是有一个进程。
-
并行 和 并发:
- 并行:是指两个或者多个事件在同一时刻发生 这样的话 单核的CPU是不能并行工作的
- 并发:是指两个或多个事件在同一时间间隔(时间段) 发生 而并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能 这也就是需要学习并发编程的原因
- 至于并行 和 并发之间的区别 和 联系这一篇博客讲的非常的不错:并行 和 并发
-
线程状态:
- 线程状态的概述:线程生命周期中 六种状态 在
java.lang.Thread.State
这个枚举中 :
程状态 导致状态发生条件 NEW(新建) 线程刚被创建,但是并未启动。还没调用start方法 Runnable(可运行) 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操 作系统处理器 Blocked(锁阻塞) 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状 态;当该线程持有锁时,该线程将变成Runnable状态 Waiting(无限等待) 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个 状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒 Timed Waiting(计时等待) 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态 将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、 Object.wait Teminated(被终止) 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡 - 线程状态的详解:
- Timed Waiting(计时等待)状态:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态 ,简单的说就是将当前正在执行的线程强制进行休眠 使用的方法就是
sleep
方法或者使用wait
方法- 使用sleep方法需要注意的几点:
- 进入
TIMED_WAITING
状态的一种常见情形是调用 sleep 方法,单独的线程也可以调用,不一定非要有协 作关系 - 为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠
- sleep与锁无关,线程睡眠到期自动苏醒,并返回到Runnable(可运行)状态。
- sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就 开始立刻执行(等到返回到Runnable状态还是需要和其他的线程进行竞争)
- 进入
- 使用sleep方法需要注意的几点:
- BLOCKED(锁阻塞)状态:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态 简单的说就是同步机制下 没有获取到所对象的线程(前提是这几个线程使用同一把锁)就是处于这个状态 直到获取到了锁对象就退出这个状态
- Waiting(无限等待)状态: 一个正在无限期等待另一个线程执行一个唤醒动作的线程处于这一状态 也就是说调用了某个对象.wait 方法的线程会等待另一个线程调用此对象.notify()方法 或 Object.notifyAll()方法来唤醒线程 进入了wait状态就会失去同步锁
- Timed Waiting(计时等待)状态:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态 ,简单的说就是将当前正在执行的线程强制进行休眠 使用的方法就是
- 总结:
- 线程状态中的疑问:D中有些大佬的解释就是进入Dead状态的线程可以恢复 这一点 不知道怎么理解
- 线程状态的概述:线程生命周期中 六种状态 在