线程基础复习

news2024/12/23 8:24:18

线程基础复习

程序:一段静态的代码

进程:正在执行的程序,是操作系统资源分配的最小单位

线程:进程可进一步细分为线程,是进程内部最小的执行单元,是操作系统进行任务调度的最小单元,属于进程

线程与进程的关系

  • 一个进程可以包含多个线程,线程隶属于进程

  • 一个进程中至少包含一个线程(主线程),在主线程中可以创建其他线程

  • 一个进程内的所有线程共享该进程的内存资源

线程的创建

继承Thread类

类就不能继承其他类

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println("MyThread:"+i);
        }
    }
}
public class Test {
    /*
       main启动java主线程
     */
    public static void main(String[] args) {
          //创建线程
          MyThread myThread = new MyThread();
                   myThread.start();//启动线程
​
        for (int i = 0; i < 1000; i++) {
            System.out.println("main:"+i);
        }
    }
}

实现Runnable

类还可以继承其他类

public class ThreadeDemo implements Runnable{
​
    /*
    currentThread() 获得当前正在执行的线程对象
    getName()获取线程名称
     */
    @Override
    public void run() {
        /*for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }*/
        System.out.println(Thread.currentThread().getName());
    }
}
public class Test {
​
    public static void main(String[] args) {
        //创建线程执行任务
        ThreadeDemo threadeDemo = new ThreadeDemo();
        //Thread t = new Thread(threadeDemo);//这是创建线程
        Thread t = new Thread(threadeDemo,"自定义线程");//这是创建线程,并为线程命名
               //t.setName("");// 为线程命名的方法
               t.start();//启动线程,在操作系统中注册,加入到就绪队列,并不是立即执行
               t.setPriority(10);//设置优先级
               Thread.currentThread().setPriority(1);
        System.out.println(t.getPriority());//获得优先级
        System.out.println(Thread.currentThread().getPriority());
​
        System.out.println("main");
    }
}

实现Callable接口

与使用Runnable相比,Callable功能更强大一些

相比run()方法,可以有返回值

方法可以抛出异常

支持泛型的返回值

需要借助FutureTask类,获取返回结果

public class SumThread implements Callable<Integer>{
​
​
    @Override
    public Integer call() throws Exception {
        int num = 0;
        for (int i = 0; i < 100; i++) {
            num+=i;
        }
        return num;
    }
}
public class Test {
​
    public static void main(String[] args) throws ExecutionException, InterruptedException {
​
        SumThread sumThread = new SumThread();
​
        // 接收任务
        FutureTask<Integer> futureTask = new FutureTask(sumThread);
​
        // 创建线程
        Thread t = new Thread(futureTask);
​
        t.start();
​
        Integer sum = futureTask.get();// 获得call方法返回值
        System.out.println(sum);
​
    }
}

线程的优先级

实际上,计算机上只有一个CPU,各个线程轮流获取到CPU的执行权,才能使用任务

优先级较高的线程有更多的机会获取到CPU,反之亦然

优先级用整数表示,取值范围在1~10,一般情况下线程默认优先级为5,但是可以通过setPriority和getPriority方法来设置或返回优先级;

调度策略

  • 时间片

  • 抢占式:高优先级的线程抢占CPU

java的调度方法:

同优先级线程组成先进先出的队列,使用时间片的策略

高优先级,使用抢占式策略

线程状态

新建:当一个线程被声明并创建时,那么该线程就是新建状态

就绪:新建的线程被start()后,将进入等待线程的队列等待CPU的时间片

运行:当就绪的线程获取到CPU资源时,便进入到了运行状态

阻塞:在某种情况下,被认为挂起或者执行输入输出操作时,让CPU临时终止自己的执行,进入阻塞状态

死亡:线程完成了它的全部工作或者线程提前被强制终止或者出现了异常

线程的分类

java中的线程分为两类:用户线程和守护线程

通俗来讲,任何一个守护线程都是非守护线程的保姆,只要当前JVM中还存在任何一个非守护线程没有结束,那么守护线程就会一直工作,当最后一个非守护线程结束时,守护线程也会随之结束

ThreadDemo1 t1 = new ThreadDemo1();
            t1.setDaemon(true);//设置线程为守护线程,必须在启动前设置,其他的用户线程结束,守护线程自动结束
            t1.start();

注意:设置守护线程一定要在启动线程之前,否则会抛出一个

IllegalThreadStateException异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python3-循环语句

Python3 循环语句 本章节将为大家介绍 Python 循环语句的使用。 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示&#xff1a; while 循环 Python 中 while 语句的一般形式&#xff1a; while 判断条件(condition)&#xff1a;执行语句(stat…

Mysql是怎样运行的——B+树索引

&#x1f4a5; 前章回顾&#xff1a; &#x1f4a5; 前面我们详细唠叨了InnnoDB数据页的7个组成部分&#xff0c;知道了各个数据页可以组成一个双向链表&#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表&#xff0c;每个数据页都会为存储在它里边的…

构建“以客户为中心”的新型商业模式

很难想象一个ERP系统能帮助企业变得更加以客户为中心。然而&#xff0c;如果采用正确的方法&#xff0c;ERP系统确实可以帮助你的企业把客户置于其所有规划、产品开发和运营的中心。 什么是以客户为中心的业务方法&#xff1f; 以客户为中心的业务方法将客户旅程放在每个行动…

图表控件LightningChart.NET 系列教程(九):LightningChart 组件——从工具箱添加至 WPF 项目

LightningChart.NET LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源&#xff0c;实时监控数据流。同时&#xff0c;LightningChart使用突破性创新技术&#xff0c;以实时优化为前提&#xff0c;大大提升了实…

将字符串生成艺术字pyfiglet.figlet_format

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】将字符串生成艺术字pyfiglet.figlet_format选择题以下关于python代码表述错误的一项是?import pyfigletmyText"python"print("【执行】pyfiglet.figlet_format")resultpyf…

第一篇:1.3Inch ISP Screen简介

1.简介官方连接: http://www.lcdwiki.com/zh/1.3inch_IPS_Module我在淘宝买的这款,其驱动IC是st7789,这款的分辨率是相对来说最高的,因此买的时候可能看到比他大的屏幕比这个还便宜.1.1产品介绍1.3寸IPS彩屏&#xff0c;支持 RGB 65K色显示&#xff0c;显示色彩丰富240X240分辨…

Vue2.0开发之——购物车案例-案例说明及导入Header(44)

一 概述 初始项目预览最终项目预览二 案例说明 2.1 初始项目代码结构 2.2 Components组件与项目的对应关系 对应关系&#xff1a; components/Counter&#xff1a;物品数量components/Footer&#xff1a;购物车底部components/Goods&#xff1a;购物车商品components/Header…

第二大脑应用程序Cogito

本文软件是网友 Juijote 推荐&#xff1b; 什么是 Cogito &#xff1f; 官方号称是 又一个第二大脑应用程序&#xff0c;其实就是一个普通的笔记软件&#xff0c;但既不支持块操作、也不支持双链&#xff0c;更不具备现在流行的白板交互。 先来张官方图片感受一下 安装 在群晖…

Java之反射

反射机制1. Java反射机制的概念1.1 静态&动态语言1.2 反射机制概念1.3 反射机制研究与应用1.4 反射机制的优缺点2. 理解Class类并获取Class实例2.1 Class类介绍2.2 获取Class类的实例2.3 那些类型可以有Class对象&#xff1f;3. 类的加载与CassLoader3.1 Java内存分析3.2 类…

【Azure 架构师学习笔记】-Azure Storage Account(1)-类型简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 前言 大数据引起了存储革命&#xff0c; 云计算又为大容量高速存储提供了可能的方案&#xff0c;每个商业云供应商都会提供特殊的云存储。而Azure 对应的云存储则称为存储帐户(Storage accou…

附录4-大事件项目后端-四个模块

目录 1 注册与登陆 1.1 代码 1.2 Bearer token 2 个人中心 3 文章分类 3.1 代码 3.2 添加/更新文章分类确保名称唯一性 3.2.1 两条数据占用 3.2.2 被一条数据同时占用 3.2.3 只有名称被占用 3.2.4 只有别名被占用 4 文章列表 4.1 代码 4.2 筛选文…

电子技术——CMOS反相器

电子技术——CMOS反相器 在本节&#xff0c;我们深入学习CMOS反相器。 电路原理 下图是我们要研究的CMOS反相器的原理图&#xff1a; 下图展示了当输入 vIVDDv_I V_{DD}vI​VDD​ 时的 iD−vDSi_D-v_{DS}iD​−vDS​ 曲线&#xff1a; 我们把 QNQ_NQN​ 当做是驱动源&#…

[AI助力] CS143学习笔记1

CS143, Compilers Lecture01 Course Overview notes 文章目录CS143, Compilers Lecture01 Course Overview notesAI summaryAI notes&#x1f447;Introduction:Interpreters:Compilers:History:Conclusion:AI flowchart流程图AI flashcards抽认卡AI费曼学习法workflow 总结关于…

Linux 利用 qemu-system-aarch64 实现 x86 机器安装 arm64 的操作系统

文章目录[toc]遇到的问题安装 qemu-system-aarch64创建 aarch64 操作系统准备 aarch64 的 iso 镜像下载 aarch64 的 UEFI 固件创建虚拟磁盘创建虚拟机语言设置时区设置安装来源软件选择磁盘分区Kdump 配置网络配置root 用户密码创建用户安装操作系统遇到的问题 qemu-system-aar…

问题三十五:傅立叶变换——带通滤波

傅里叶变换&#xff08;Fourier Transform&#xff09;是一种用于分析信号的数学工具&#xff0c;它将信号分解成若干个不同频率的正弦和余弦函数。在图像处理中&#xff0c;傅里叶变换可以用来分析图像中各个频率的成分&#xff0c;从而进行滤波、增强等操作。 在傅里叶变换中…

电商项目后端框架SpringBoot、MybatisPlus

后端框架基础 1.代码自动生成工具 mybatis-plus &#xff08;1&#xff09;首先需要添加依赖文件 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.2</version></dependency><de…

【markdown】markdown语法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

亿华通寻路:“氢”能之火,何以燎原?

氢&#xff0c;是能满足人类一切幻想的终极能源。以氢作为燃料的燃料电池&#xff0c;虽然还没有锂电池行业那样风光&#xff0c;但也在新能源战略布局中占有不可撼动的地位。近两年各界玩家跨界入局&#xff0c;更是掀起了持续的投资浪潮。在国内&#xff0c;政策依然是氢能发…

JAVA进阶--->JVM

文章目录JVM--java Virtual MachineJVM当时学习的存在位置JVM概述(什么是JVM)为什么学习JVM&#xff1f;虚拟机JVM作用JVM组成部分类加器作用类加载过程类什么时候会被加载&#xff08;初始化&#xff09;类加载器双亲委派机制打破双亲委派机制运行时数据区1.程序计数器2.本地方…

提取游戏《Limbus Company》(边狱公司)内素材

注意事项 相关工具会传到网盘。链接如下&#xff08;如果没链接那就是过期还没更新/文章没更新) BGM&#xff1a; 解包工具合集&#xff08;不包含uestdio&#xff0c;assetstdio)&#xff1a;点击此处 此文章主要是讲解如何提取游戏内的音频文件&#xff0c;所以默认各位会…