Day21多线程

1.多线程
1.1程序,进程,线程
程序:一组命令的集合,为了完成指定的功能,程序是静态概念,一般保存在硬盘当中
进程:正在运行的程序,是一个动态概念,需要保存在内存中,操作系统会分配对应的PID,当我们直接关闭某个进程的时候,该进行会在内存中被销毁
线程:一个程序中,不同的执行分支,如果同一个时间节点允许多个线程同时执行的时候,我们称为支持多线程

1.2并行和并发
并行:多个CPU,同时执行多个任务
并发:一个CPU,同时执行多个任务

多线程并行 必须要大于等于2才行
单核CPU是没有多线程的

1.3单核CPU和多核CPU
a)单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务。例如:虽然有多车道,但是只有一个工作人员在收费,只有收了费才能通过,那么CPU就好比收费人员。如果有人不想交钱,那么收费人员可以把他"挂起"(晾着他,等他想通了,准备好了钱,再去收费)。但是因为CPU时间单元特别短,因此感觉不出来
b)如果是多核的话,才能更好的发挥多线程的效率。(现在的服务器都是多核的)
c)一个java应用程序java.exe,其实至少有三个线程:main()主线程,gc() 垃圾回收线程,异常处理线程。当然如果发生异常,会影响主线程。
1.4多线程优缺点和应用场景
背景:以单核CPU为例,只能使用当个线程先后完成多个任务(调用多个),肯定比用多个线程来完成用的时间更短,为何仍需多线程呢?
多线程程序的优点:
1.提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
2.提高计算机系统CPU的利用率
3.改善程序结构。将既长又复杂的进程分为多个线程,能独立运行,利于理解和修改
 程序需要同时执行两个或多个任务。
 程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等。
 需要一些后台运行的程序时。
1.5线程创建
1.5.1Thread

在这里插入图片描述
在这里插入图片描述
1.5.2Runnable
在这里插入图片描述
在这里插入图片描述1.5.3 继承和实现的区别
public class Thread extends Object implements Runnable
 区别
 继承Thread:线程代码存放Thread子类run方法中。
 实现Runnable:线程代码存在接口的子类的run方法。
 实现方式的好处
 避免了单继承的局限性
 多个线程可以共享同一个接口实现类的对象,非常适合多个相同线 程来处理同一份资源。
1.6优先级和常用方法
线程的优先级等级
d) MAX_PRIORITY:10
e) MIN _PRIORITY:1
f) NORM_PRIORITY:5
涉及的方法
g) getPriority() :返回线程优先值
h) setPriority(int newPriority) :改变线程的优先级
说明
i) 线程创建时继承父线程的优先级
j) 低优先级只是获得调度的概率低,并非一定是在高优先级线程之后才被调用
1.6.2常用方法
在这里插入图片描述
1.6.3使用方式
在这里插入图片描述
1.7生命周期
JDK中用Thread.State类定义了线程的几种状态
要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类 及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五 种状态:
新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建 状态
就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配到CPU资源
运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态, run()方法定义了线 程的操作和功能
阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出 CPU 并临时中止自己的执行,进入阻塞状态
死亡:线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束
在这里插入图片描述
1.8线程控制
在这里插入图片描述
1.8.1线程停止
在这里插入图片描述
在这里插入图片描述
1.8.2线程合并
在这里插入图片描述1.8.3Yield
在这里插入图片描述在这里插入图片描述

1.9线程同步
1.9.1 概述
问题的提出
多个线程执行的不确定性引起执行结果的不稳定
多个线程对账本的共享,会造成操作的不完整性,会破坏数据
在这里插入图片描述
在这里插入图片描述

1.9.2 不同步带来的问题

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.9.3 解决方案
1.9.3.1 方法锁
在这里插入图片描述

方法使用synchronized之后,该方法只能有一个线程执行
1.9.3.2 语句块锁
假如 该方法中,只有部分代码需要同步的时候,如果通过synchronized修饰,效率会大大折扣
所以 我们可以通过语句块锁,只锁对应的代码,这样的话该方法中其他的代码还是可以同时执行,效率有所提升
在这里插入图片描述

1.9.4 Synchronized

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.10 Lock
1.10.1 概述
 从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同
步锁对象来实现同步。同步锁使用Lock对象充当。
 java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的 工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象 加锁,线程开始访问共享资源之前应先获得Lock对象。
 ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和 内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以 显式加锁、释放锁。
1.10.2 使用
在这里插入图片描述

1.10.3 优缺点
在这里插入图片描述

1.11 定时器任务
1.11.1 概述
在这里插入图片描述

1.11.2 使用

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,没有找到关于ES多线程分组分页查询的信息。不过,ES支持多线程查询和分组分页查询,可以分别介绍一下。 1. ES多线程查询 ES支持多线程查询,可以通过设置线程池来控制并发查询的数量。以下是一个使用Python Elasticsearch库进行多线程查询的例子: ```python from elasticsearch import Elasticsearch from elasticsearch.helpers import parallel_bulk from multiprocessing import Pool es = Elasticsearch() def process_data(data): # 处理数据的函数 pass def index_data(data): # 索引数据的函数 pass def run_query(query): # 运行查询的函数 pass def run_parallel_bulk(data): with Pool(processes=4) as pool: for success, info in parallel_bulk(es, data, index='my-index', chunk_size=1000, thread_count=4): if not success: print('A document failed:', info) ``` 在上面的例子中,我们使用了Python的multiprocessing库来创建一个进程池,然后使用Elasticsearch的parallel_bulk函数来并发地索引数据。 2. ES分组分页查询 ES支持分组分页查询,可以使用Elasticsearch的search方法来实现。以下是一个使用Python Elasticsearch库进行分组分页查询的例子: ```python from elasticsearch import Elasticsearch es = Elasticsearch() def search_data(): query = { "size": 0, "aggs": { "group_by_field": { "terms": { "field": "my_field", "size": 10 }, "aggs": { "group_by_date": { "date_histogram": { "field": "my_date_field", "interval": "day" }, "aggs": { "sum_by_field": { "sum": { "field": "my_sum_field" } } } } } } } } res = es.search(index="my-index", body=query) return res ``` 在上面的例子中,我们使用了Elasticsearch的聚合功能来进行分组分页查询。我们首先按照my_field字段进行分组,然后按照my_date_field字段进行日期直方图聚合,最后对my_sum_field字段进行求和聚合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值