java多线程-线程生命周期及状态
目录标题
- 创建线程的四种方式
- 线程的状态和生命周期
- 线程中改变状态的方法
- 线程停止
- 设置和获取线程名
- 线程优先级
创建线程的四种方式
- 继承Thread类
- 实现Runnable接口
- 使用Callable和Future创建线程
- 使用Executor框架创建线程池
创建线程的具体实现可以参考创建线程的四种方式
线程的状态和生命周期
线程的状态我们可以在api文档中搜索Thread.State便可以得到下列的六种状态。
Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态,线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换
状态 | 描述 | 官方解释 |
---|---|---|
新建状态(NEW) | 创建线程对象 | 至今尚未启动 |
就绪状态(RUNNABLE) | start()方法 | 正在java虚拟机中执行的线程 |
阻塞状态(BLOCKED) | 无法获得锁对象 | 受阻塞并等待某个监视器锁的线程 |
等待状态(WAITING) | wait()方法 | 无限期的等待另一个线程来执行某一特定操作的线程 |
计时状态(TIMED_WAITING) | sleep()方法 | 等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。 |
结束状态(TERMINATED) | 全部代码运行完毕 | 已退出的线程处于这种状态。 |
线程的状态图如下,我会不断完整,而上面的一些方法都会一一学习,呢么这些线程是怎么变化的呢?
所以我们就会学习到一些改变状态的方法
线程中改变状态的方法
实例:无限期等待/限期等待/阻塞
线程停止
java中原来提供的一个方法stop,使用stop方法强行终止线程,但是不推荐使用这个方法,因为stop和suspend、resume一样,都是过期作废的方法。
所以我们一般采用通知机制来停止-》其实很容易理解,定义一个布尔值,指定条件判断停止
实例
设置和获取线程名
方法介绍
方法名 说明 void setName(String name) 将此线程的名称更改为等于参数name String getName() 返回此线程的名称 Thread currentThread() 返回对当前正在执行的线程对象的引用 代码演示
package m08.d07.xian;public class Test1 {public static void main(String[] args) {MyRunnable mr = new MyRunnable();Thread t1 = new Thread(mr); // 创建线程Thread t2 = new Thread(mr, "线程二"); //创建线程并设置线程名为线程二Thread t3 = new Thread(mr);t3.setName("线程三");t1.start();t2.start();t3.start();System.out.println("在main执行的线程的名字是:" + Thread.currentThread().getName());// 打印如下,因为是线程所有没有顺序// 在main执行的线程的名字是:main//当前线程的名字是:线程二//当前线程的名字是:线程三//当前线程的名字是:Thread-0}}class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("当前线程的名字是:" + Thread.currentThread().getName());}
}
线程优先级
线程可以划分优先级,优先级高的线程得到的CPU资源比较多,也就是CPU优先执行优先级高的线程对象中的任务。
线程调度
两种调度方式
- 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
- 抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
Java使用的是抢占式调度模型
随机性
假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的
优先级相关方法
方法名 说明 final int getPriority() 返回此线程的优先级 final void setPriority(int newPriority) 更改此线程的优先级线程默认优先级是5;线程优先级的范围是:1-10 代码演示
class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "---" + i);}return "线程执行完毕了";} }class Demo {public static void main(String[] args) {//优先级: 1 - 10 默认值:5MyCallable mc = new MyCallable();MyCallable mc2 = new MyCallable();FutureTask<String> ft = new FutureTask<>(mc);FutureTask<String> ft2 = new FutureTask<>(mc2);Thread t1 = new Thread(ft,"线程1");Thread t2 = new Thread(ft2,"线程2");t1.setPriority(10);System.out.println("t1线程优先级" +t1.getPriority());//5t1.start();System.out.println("t2线程优先级"+t2.getPriority());//t2.start();} }
java多线程-线程生命周期及状态相关推荐
- java不同进程的相互唤醒_Java线程生命周期与状态切换
前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...
- 详解Java线程生命周期与状态切换
前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...
- Java线程生命周期与状态切换
前提# 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候 ...
- Java多线程:生命周期,实现与调度
Java线程生命周期 Java线程实现方法 继承Thread类,重写run()方法 实现Runnable接口,便于继承其他类 Callable类替换Runnable类,实现返回值 Future接口对任 ...
- 正在中止线程 iis_Zephyr线程生命周期及状态
Zephyr中线程是使用CPU的最小单位,线程从创建后由zephyr内核进行调度,根据运行和等待资源的状况在几个状态中切换,直到线程终止退出生命周期. 线程状态 线程在其生命周期中有下面6种状态: N ...
- java中线程的生命周期_Java中的线程生命周期– Java中的线程状态
java中线程的生命周期 Understanding Thread Life Cycle in Java and Thread States are very important when you a ...
- Java并发编程|第二篇:线程生命周期
文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...
- 13.7 线程生命周期状态图、线程常用的方法。
package cn.chen.samplethread; import java.lang.*; /* 线程生命周期状态图.线程常用的方法.线程的生命周期:创建状态.等待就绪态.运行状态.阻塞状态. ...
- Java多线程——线程的优先级和生命周期
Java多线程--线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...
- java 线程 状态 图_Java线程中的生命周期和状态控制图文详解
这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...
最新文章
- 【STBC】Alamouti,STBC误码率仿真
- 1.模型 16个相机参数(内参、外参、畸变参数)
- 【Python 】单引号和双引号有什么区别?
- C++ const详解
- 一个路由再接另一个路由,让和别人合拉的一个网线可以多台电脑一起使用
- centos7同一服务器安装两个或多个Tomcat
- 看以色列话剧《安魂曲》(图)
- QuickTime文件格式解析
- 怎么去掉ECSHOP的Powered by ECShop版权信息
- java类与接口练习
- linux窗口黑边,解决deepin-scrot在gnome3截图顶部出现黑边问题
- WARNING:Result from SERVER not valid. Partial Result:
- Web开发中常用的linux命令 详解
- 孙鑫VC学习笔记:第十六讲 (二) 利用关键代码段实现线程间的同步
- java并发编程实战源码_java并发编程实战(附源码)
- 药店管理系统设计方案开发
- 亿晟科技安卓主板应用品类方案详解
- 开源crm客户关系统管理系统源码,免费分享
- 如何用python抓地图_【数据不用愁】手把手教你抓取地图矢量数据【附代码和矢量地图数据】...
- js获取当前URL、域名、端口号等