商业网站 模板,做网站都需要准备什么软件,龙岗营销网站建设公司,网站排名高权重低多线程技术是我们后端工程师在面试的时候必问的一个知识点#xff0c;今天就来盘点一下多线程的相关知识#xff0c;
先来说下进程#xff0c;线程及线程的生命周期#xff1a; 进程#xff1a;进程就是正在进行中的程序#xff0c;是没有生命的实体#xff0c;只有在运…多线程技术是我们后端工程师在面试的时候必问的一个知识点今天就来盘点一下多线程的相关知识
先来说下进程线程及线程的生命周期 进程进程就是正在进行中的程序是没有生命的实体只有在运行时处理器才会赋予它生命才能成为一个活动的实体我们称之为“进程”。 每一个进程都有一个独一无二的编号被成为进程编号简称PID Process identifierPID是一串数字取值为 1-32768。 每个进程有独立的地址空间和资源相互之间不会直接影响。
线程线程是进程中的执行运算的最小单位是进程中的一个实体是被系统独立调度和分派的基本单位线程自己不拥有系统资源可以与同属同一个进程的其他线程共享进程所拥有的全部资源。虽然线程共享资源但每个线程有自己的栈空间和程序计数器独立运行进程之间可以并发执行。
进程和线程的关系一个进程可以包含多个线程线程是进程的一部分。打个比方把领导分配的一个开发任务比作一个进程参与这个开发任务的开发人员就是线程如果多个开发人员一起开发就属于多个线程并发执行。如果只有一个开发人员开发那就是单线程执行。
下面详细说一下线程因为面试的时候线程相关知识被问到的概率还是很大的。
1、线程生命周期的几种状态 线程的生命周期指的是线程从创建到销毁的整过过程通常情况下线程的生命周期有以下5种状态
初始状态可运行状态运行状态休眠状态终止状态
这5种状态转化图如下
通用的状态有以上五中但是看Thread.State 源码会发现 Java 线程的生命周期和上面说的生命周期是不同的代码里有以下状态 1NEW初始化状态 2RUNNABLE:可运行状态就绪状态 3BLOCKED阻塞状态 4WAITING无限时等待状态 5TIMED_WAITING有时限等待状态 6TERMINATED终止状态
分别解释下这6中状态不想看太多文字的可直接看最后的图片总结
1New-初始化状态表示线程被创建但是尚未启动的状态 new Thread() 新建一个线程但是如果线程没有开始运行start()方法所以也没有开始执行run()方法中的代码那么它此时的状态就是初始化状态。
2Runable-可运行状态 Java 中的 Runable 状态对应操作系统线程状态中的两种状态分别是 Running 和 Ready。到了这个状态下一步要么等着执行要么直接执行。 也就是说Java 中处于 Runnable 状态的线程有可能正在执行也有可能没有正在执行正在等待被分配 CPU 资源。 所以如果一个正在运行的线程是 Runnable 状态当它运行到任务的一半时执行该线程的 CPU 被调度去做其他事情导致该线程暂时不运行它的状态依然不变还是 Runnable因为它有可能随时被调度回来继续执行任务。
3Blocked-阻塞状态 阻塞状态包括三种状态分别是 Blocked(被阻塞、Waiting(等待、Timed Waiting(计时等待 处于运行中的线程由于某种原因放弃对cpu的使用权处于阻塞状态直到其进入就绪状态才有机会再次被cpu调用进入运行状态。一般进入Blocked状态 只有一种可能就是进入 synchronized 保护的代码块或者方法时没有抢到monitor锁 当处于 Blocked的线程抢到 monitor 锁就会从 Blocked 状态回到Runnable 状态。
4Waiting-无限时等待没有超时时间的等待进入waiting状态一般有以下几种情况
没有设置 Timeout 参数的 Object.wait() 方法 其他线程调用notify() 或 notifyAll()来唤醒。没有设置 Timeout 参数的 Thread.join() 方法join的线程结束或者被中断上一线程才会进入就绪状态。LockSupport.park() 方法通过 执行了 LockSupport.unpark()方法唤醒。
5Timed Waiting-有限时等待有超时时间的等待 如果超时时间到了且能直接获取到锁直接恢复到 Runnable 状态进入此状态一般有以下几种情况
设置了时间参数的 Thread.sleep(long millis) 方法设置了时间参数的 Object.wait(long timeout) 方法设置了时间参数的 Thread.join(long millis) 方法设置了时间参数的 LockSupport.parkNanos(long nanos) 方法和 LockSupport.parkUntil(long deadline) 方法执行LockSupport.unpark()方法可直接唤醒。
6Terminated-终止状态线程执行结束的状态。
正常结束线程结束也就是线程终止出现一个没有捕获的异常终止了 run() 方法最终导致意外终止。调用stop()会造成死锁线程不安全不建议使用
2、用一张图来说明各个状态之间的转化流程