JAVA笔记16--线程

进程

进程是处于运行过程中的程序,具有独立的功能,是系统进行资源分配和调度的独立单位。

  • 独立性

进程是系统重独立存在的实体,它拥有自己独立的资源,每个进程都拥有自己私有的地址空间,在没有经过进程本身允许的情况下,一个进程不能访问其他进程的地址空间;

  • 动态性

进程是一个正在系统中活动的指令集合,包含子时间的概念,具有自己的生命周期和状态;

  • 并发性

在单个处理器上,多个进程可以并发地执行,并且在执行时他们彼此之间不会互相的影响。

并发与并行的区别

  • 并行

在同一时刻,有多条指令在多个处理器上同时执行;

  • 并发
  1. 在同一个时刻,某一个处理器只能执行一条指令;
  2. 多个进程的指令可以被快速的轮换执行,使得宏观上具有多个进程同时执行的效果;

对于多核计算机,当进程数多于核心数,也会存在并发的行为!

线程

  1. 线程扩展了进程的概念,使得同一个进程可以同时并发处理多个任务;
  2. 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程;
  3. 线程不拥有系统资源,它与父进程里的其他线程共享父进程拥有的全部系统资源
  4. 系统可以同时执行多个任务,每个任务就是线程;进程可以同时执行多个任务,每个任务就是线程。

线程优点

  • 容易共享内存

进程之间不能共享内存,但线程之间共享内存非常容易,因为与分隔的进程相比,线程之间的隔离程度要小,他们共享内存、文件句柄,其他每个进程应有的状态;

  • 运行效率更高

系统创建进程时需要为其分配系统资源,但创建线程时不需要,所以线程的运行效率更高;

  • 编程方式简单

Java内置了多线程功能的支持,并不是简单地对操作系统的底层进行调度,编程更方便。

线程的创建方式

Java的线程模型

  1. Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例;
  2. 线程用于完成一定的任务(执行一段程序流),Java使用线程执行体来代表这段程序流
  3. 线程使用过程:定义线程执行体->创建线程对象->调用线程对象的方法来启动线程。

继承Thread类

  1. 定义Thread类的子类,并重写该类的run()方法(线程体);
  2. 创建Thread类的子类的实例,即线程对象;
  3. 调用线程对象的start()方法,即启动这个线程。

实现Runnable接口

  1. 定义Runnable接口的实现类,并实现该接口的run()方法(线程体);
  2. 创建Runnable实现类的实例,并以此作为target来创建Thread对象;
  3. 调用Thread对象的start()方法来启动线程。

实现Callable接口

  1. 定义Callable接口的实现类,并实现该接口的call()方法(线程体);
  2. 创建Callable接口的实例,并使用Future接口来包装Callable对象,最后使用Future对象(线程的返回值)作为target来创建Thread对象;
  3. 调用Thread对象的start()方法来启动线程;
  4. 调用Future对象的get()方法获取线程的返回值。

三种方式的比较

继承父类的方式

优点:编程比较简单

缺点:线程类已经继承Thread类,所以不能再继承其他的父类。

实现接口的方式

优点:线程类只实现了接口,还可以继承于其他父类

缺点:编程比较麻烦。

建议采用实现Runnable接口的方式,若需要获取返回值则采用实现Callable接口的方式

线程的生命周期

当线程被创建之后,它不会立刻进入运行状态,也不会一直处于运行状态。

在线程的生命周期中,需要经过如下5中状态:

1.新建(New)2.就绪(Ready)3.运行(Running)4.阻塞(Blocked) 5.死亡(Dead)

控制线程

线程休眠

Thread类提供了休眠方法,可以让当前线程暂停一段时间:

static void sleep (long millis)

static void sleep(long millis,int nanos)

sleep() vs yield()

sleep()会让线程进入阻塞状态,而yield()会让线程进入就绪状态;

sleep()给其他线程运行的机会,不理会其他线程的优先级,yield()考虑线程的优先级,只会给优先级相同或者更高的线程执行机会。

等待线程

Thread类提供了等待方法,可以让调用方等待该线程直至它死亡。

后台线程

后台线程,也叫守护线程,或精灵线程;它是在后台运行的,它的任务就是为其他线程提供服务;如果所有的前台线程都死亡,则后台线程会自动死亡。线程默认是前台线程,Thread类提供如下方法来设置后台线程:

void setDaemon (boolean on); boolean isDaemon()

前台线程都死亡后,JVM会通知后台线程死亡,但他从接收指令到做出响应,需要一定的时间。

线程优先级

线程安全问题

死锁

当两个线程互相等待对方释放同步监视器时会发生死锁,应避免这种情况的出现;

线程通信

线程通信的前提是要求支持并发读写数据,所以线程通信前必须要对共享资源加锁。

synchronized

synchronized(obj) {...}

synchronized void fun()  {...}

Lock

Condition condition=lock.newCondition();

 阻塞队列

生产者消费者模式

  1. 某个模块负责产生数据,另一个模块负责处理数据;
  2. 产生数据的模块被称为生产者;处理数据的模块被称为消费者;
  3. 需要有一个缓冲区位于消费者与生产者之间,作为沟通的桥梁;
  4. 生产者只负责吧数据放入缓冲区,而消费者从缓冲区取出数据;

BlockingQueue

BlockingQueue是Queue的子接口,他的主要作用是作为线程通信的工具;

BlockingQueue增加了2个支持阻塞的方法:

void put(E e):尝试把元素e放入队列中,如果该队列的元素已满,则阻塞该线程;

void take():尝试从队列的头部取出元素,如果元素已空,则阻塞该线程;

线程组

ThreadGroup类代表线程组,它可以包含一批线程,并对这些线程进行统一的管理;

  1. 每个线程都有对应的线程组,若程序未显示指定线程的线程组,则该线程属于默认线程组;
  2. 默认情况下,子线程与它的父线程组属于同一个线程组,而main线程归属于Main线程组;
  3. 一旦线程加入某个线程组,则该线程将一直属于这个线程组,中途不允许修改其线程组。

创建线程组

使用线程组

线程池

        启动线程的成本是比较高的,通过线程池可以实现线程的复用,从而提高性能;线程池可以控制程序中的线程的胡亮,避免超出系统的负荷,导致系统的崩溃。

  1. 创建线程池之后,他会自动创建一批空间的线程;
  2. 程序键线程体传给线程池,他就会启动一个空闲的线程来执行线程体;
  3. 当线程体执行结束后,该县城不会死亡,而是变成空闲的状态继续使用。

创建线程池

使用线程池

ForkJoinPool

  1. Fork/Join是一种思想,旨在充分利用多核资源,用于执行并行任务;
  2. ForkJoinPool是ExecutorService的实现类,是上述思想的实现;
  3. 它的做法是,将一个大的任务分割成若干小任务,最终汇总成每个小任务结果,从而得到大任务的结果;

创建ForkJoinPool

使用ForkJoinPool

ThreadLocal

线程安全的集合

包装不安全的集合

包装安全的集合

网络编程

InetAddress

public class InetAddressDemo {public static void main(String[] args) throws IOException {InetAddress baidu= InetAddress.getByName("www.baidu.com");System.out.println(baidu.getHostAddress());System.out.println(baidu.isReachable(2000));InetAddress local=InetAddress.getByAddress(new byte[]{127,0,0,1});System.out.println(local.getHostName());System.out.println(local.isReachable(2000));}
}

线程同步

同步:对在一个系统中所发生的事件之间进行协调,在事件上出现一致性与统一化的现象;

加锁

1.加锁>修改>解锁

2.加锁机制可以保障在任一时刻只有一个线程可以进入共享资源的代码区(临界区)。

synchronized

 

Lock

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

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

相关文章

leetcode1237. 找出给定方程的正整数解

1237. 找出给定方程的正整数解https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/ 难度中等 101 给你一个函数 f(x, y) 和一个目标结果 z,函数公式未知,请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满…

在线教育系统源码深度剖析:从零开始开发一款企业培训APP

下文,笔者将与大家一起深入研究在线教育系统源码,同时探究从零开始开发一款面向企业培训的APP所涉及的关键技术和流程。 一、背景介绍 企业培训是组织内部不可或缺的一环,而在线教育系统通过数字化手段,使培训更加灵活、个性化。…

深度学习与图像描述生成——看图说话(3)

目录 一、整体架构 二、学习策略 2.1 监督学习 2.2 无监督学习 2.3 强化学习 三、特征映射 3.1 定义 3.2 原理 3.3 关键技术 3.4 重要案例 3.5 特别注意下特征空间这一概念 四、语言模型 4.1 定义与原理 4.2 关键技术 4.3 重要性与作用 4.4 案例与应用 五、注…

访问网站时IP被阻止?5个解决方法

相信很多人遇到过IP禁令:比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问,又或者你的的账号莫名被封,这些由于网络上的种种限制我们经常会遭遇IP被封的情况,导致无法使用继续进行网络行动。在本文中,我们…

SpringBoot集成Milvus2.3.4(2) |(实现向量的增删改查)

SpringBoot集成Milvus2.3.4(2) |(实现向量的增删改查) 文章目录 SpringBoot集成Milvus2.3.4(2) |(实现向量的增删改查)@[TOC]前言一、Milvus数据库的新增1.新增数据二、Milvus删除数据1.删除数据三、Milvus更新数据1.更新数据四、Milvus查询数据1.查询数据总结章节 第一…

704.二分查找(力扣LeetCode)

704.二分查找(力扣LeetCode) 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums…

【Mysql】数据库如何查询按 list 集合顺序的记录

场景 现在要在数据库中查询id在 list<String> 集合中记录&#xff0c;结果并按 list<String> 集合中顺序进行排序。 解决方案&#xff1a; field()函数 field() 函数的返回值是value在值列表中的索引位置。此函数执行不区分大小写的搜索。如果在值列表中找不到v…

红帽认证有啥用?初级红帽认证证书值得考吗?

大家好&#xff0c;这里是G-LAB IT实验室。 今天我们来了解一下Linux红帽认证。 红帽认证已成为企业和个人竞相追逐的热门资质。 红帽认证认可度究竟如何?红帽RHCSA认证含金量又有多高? 下面G-LAB将为你一一解答。 1 、红帽认证认可度怎么样&#xff1f; 事实上&#xff0…

钉钉互动卡片对接-普通互动卡片接入流程

这里写目录标题 一、创建内部应用二、搭建普通卡片模板三、调用互动卡片服务端接口接口报文一、发送卡片二、更新卡片三、获取token 一、创建内部应用 登录开发者后台&#xff0c;创建内部应用。 例如 百度-内部测试获取AppKey和AppSecret&#xff0c; 获取应用访问凭证获取企…

cmd_to_robot 讨论及 G29 控制优化

cmd_to_robot 讨论及 G29 控制优化 cmd_to_robot 讨论 转向电机控制代码中&#xff0c;补偿信息在循环中发布&#xff0c;转向完成信息在回调函数中发布 转动电机控制代码中&#xff0c;对转动电机的控制在转向完成的回调函数中实现 这就意味着如果一直没有 /cmd_vel 消息发…

蓝桥杯备赛 week 1 —— DP 背包问题

目录 &#x1f308;前言&#x1f308;&#xff1a; &#x1f4c1; 01背包问题 分析&#xff1a; dp数组求解&#xff1a; 优化&#xff1a;滚动数组&#xff1a; &#x1f4c1; 完全背包问题 &#x1f4c1; 总结 &#x1f308;前言&#x1f308;&#xff1a; 这篇文章主…

第10次修改了可删除可持久保存的前端html备忘录

第10次修改了可删除可持久保存的前端html备忘录 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

ASTM F2057-23衣物收纳商品安全标准

美国每年均有大量因衣物存放装置翻倒而造成人员伤害甚至死亡的报道。 因此&#xff0c;美国消费品安全委员会CPSC于2023年4月19日发布决定&#xff0c;将ASTM F2057-23作为美国消费品安全委员会的强制性安全标准&#xff0c;替代16 CFR 1261&#xff0c;以此更好保护消费者免受…

五种主流数据库:排除重复结果

查询语句有可能会返回重复的数据&#xff0c;我们可以使用 DISTINCT 关键字排除查询结果中的重复记录。 本文比较五种主流数据库排除重复查询结果的实现和差异&#xff0c;包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。 排除重复结果MySQLOracleSQL ServerPostg…

关于Linux系统的目录结构介绍常用命令介绍

目录 一. Linux系统目录结构介绍 二. 一些常用命令的介绍 1、# 与 $的区别 2、ifconfig 3、su 4、cd 5、目录查看 6、查看文件内容 7、创建目录及文件 8、复制和移动 9、其他 10、tar 11、which 12、whereis 13、find 14、chmod 三. vim的基本使用 四. SSH密…

android gradle 使用总结

一 buildscript buildscript&#xff1a;这里面的声明&#xff08;repositories&#xff0c;dependencies&#xff09;是 gradle脚本自身需要使用的资源&#xff0c;会优先加载&#xff0c; 而外面的声明&#xff08;repositories&#xff0c;dependencies&#xff09;是项目…

QT+C++桌面程序窗体框架模板-中英文切换-文件打开历史记录-工具选项设置

程序示例精选 QTC桌面程序窗体框架模板-中英文切换-文件打开历史记录-工具选项设置 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《QTC桌面程序窗体框架模板-中英文切换-文件打开历史记录-…

认识数学建模

文章目录 1 什么是数学建模2 数学建模的比赛形式3 参加数学建模的好处4 数学建模的流程5 数学建模成员分工6 数学建模常用软件7 数学建模竞赛7.1 美国大学生数学建模竞赛7.2 MathorCup高校数学建模挑战赛7.3 华中杯大学生数学建模挑战赛7.4 认证杯数学建模网络挑战赛7.5 华东杯…

Web08--JavaScript高级

1、BOM对象 BOM&#xff1a;browser object model 浏览器对象模型 BOM对象包括window对象、screen对象、history对象、location对象、navigator对象。 1.1 window对象 所有的浏览器都支持window对象。它表示的浏览器窗口 window对象是js中的顶层对象&#xff0c;所有的j…

HAL STM32+EC11编码器实现增减调节及单击、双击、长按功能

HAL STM32EC11编码器实现增减调节及单击、双击、长按功能 &#x1f4fa;实现效果演示&#xff1a; &#x1f4d8;内容提要 &#x1f4dd;本文主要实现&#xff0c;通过STM32 HAL库开发&#xff0c;实现的EC11编码器功能&#xff0c;按键结合状态机思想实现的拓展单击、双击、…